به عنوان یک توسعه دهنده، ما همیشه رو کدهایی که مینویسیم تمرکز میکنیم و یکی از چیز هایی که عمدتا نادیده میگیریم امنیت اپلیکشن ها و آسیب پذیری اونهاست ، یکی از موارد بسیار مهم در توسعه اپ های فلاتری و چه غیر فلاتری همین بحث امینت است .
زمانی که اپ شما از حالت debug و توسعه به حالت prodoction میرسه ممکنه آسیب پذیری هایی داشته باشه که به هر نحوی میتونه حریم خصوصی کاربران رو به خطر بندازه و یا منجر به یک فاجعه تجاری یا اجتماعی بشه .
پنج روشی که میتونه تا حدودی پروژه تون رو امن کنه !
obfuscation
obfuscation یا مبهم سازی کد ها روشیه که نام متغیر ها کلاس ها و توابع رو با روش هایی مبهم میکنه تا مهندسی معکوس پروژه سخت تر بشه.
برای obfuscation پروژه از دستور زیر استفاده کنید
flutter build apk --obfuscate --split-debug-info=/<project-name>/<directory>
در دستور بالا شما باید ۲ چیزو داخل دستور جایگزین کنید یکی project name (نام پروژه خودتون) و دیگری directory یعنی مسیر پروژه خودتون . با دستور زیر هم میتونید برعکس دستور بالا پروژه رو دیکد کنید:
flutter symbolize -i <stack trace file> -d /out/android/app.android-arm64.symbols
این رمزنگاری برای پلتفورم های android و ios و MacOs پشتیبانی و برای وب هم به صورت خودکار صورت میگیره و اما لینوکس چون openSource هست و رمزنگاری کد ها و مخفی کردن کد ها با قوانین لینوکس در تناقض هست! رمزنگاری در کار نخواهد بود.
محافظت از تسک های BackGround و snapShotها
زمانی که اپ شما در بکگراند در حال اجرا است ،snapShot هایی از اخرین state های برنامه به صورت خودکار در صفحه task Switcher گوشی، همون جایی که دکمه وسط معروف رو میزنید و بین اپ های باز جابجا میشید ، نشون داده میشه حالا فرض کنید وقتی که کاربر میخواد ، بین اپلیکیشن هاش جابجا بشهاطلاعات حساس مثل اطلاعات حساب بانکی و .. در حین جابجایی معلومه! این خودش به نوعی یه آسیب پذیریه میتونه باشه ! باید کاری کنیم که هنگام switch یک صفحه رنگی نشون داده بشه . برید سراغ پکیج زیر 🙂
https://pub.dev/packages/secure_application
Local authentication
احراز هویت محلی با استفاده از قابلیت های احراز هویت دستگاه بر میگرده که چند نوع از اونا را ساپورت میکنه.
قابلیت هایی مثل پرداخت درون برنامه ای یا کار با درگاه های بانکی یا به طور کلی کار با وجوه مالی ، به این نوع احراز هویت نیاز دارند. میتونیم از احراز هویت های biometric کمک بگیریم، در ios و اندروید میتونیم از مواردی مواردی مثل touch Id یا lock code یا اثر انگشت استفاده کنیم ، یه سر به پلاگین local_auth بزن 🙂
https://pub.dev/packages/local_auth
استفاده از storage های امن !
Shared preferences یک روش کلید- مقدار مشهور و معروفه که خیلی استفاده میشه ، اما همچین برای نگهداری داده های حساس امن نیست و بهتره که برای اطلاعات حساس استفاده نشه
اگر به فایل Readme این پکیج نگاه کنید هیچ ضمانت و گارانتی از سمت توسعه دهندگان این پلاگین ارائه نشده :/
خب چیکار کنیم؟ کی تضمین میکنه که hive یا getStorage یا sqlite امن باشه؟ هیچکی 🙂
شما باید هوای دیتای خودتون رو با اینکریپت کردنش داشته باشید و میتونم مدعی باشم که دیتابیس ها موظف به گارانتی کردن داده های شما نیستن، بلکه خودتون هستید ، میتونید از رمز نگاری های Aes و KeyChain استفاده بکنید، این پلاگین سکیور استوریج رو ببین حتما 🙂 .
https://pub.dev/packages/flutter_secure_storage
Root دستگاه های android و یا Jailbreaking دستگاه های iOS
دستگا های Android میتونن root بشن یا دستگاه های ios ممکنه jailbroken بشن، با این کار پالیسی های امنیتی اون پلتفورم از بین میرن و دسترسی به دیتای اپ ما هم ممکنه دور از ذهن نباشه… با لایبرری زیر میتونی تشخیص بدی که یه گوشی روت یا جیلبریک هست یا نه و اگه بود، اجازه فعالیت بدی یا ندی یا یه کاری که صلاح میدونی انجام بدی..
https://pub.dev/packages/flutter_jailbreak_detection
البته در مورد امنیت در اپلیکیشن خیلی حرف دارم، که تو یکی از اپیزود های رادیو فلاتر در مورش میگم