امنیت موبایل مجموعهای از اقدامات برای محافظت از برنامه، دادههای کاربر و زیرساخت سرور در برابر حملات و نشتها است. بر اساس OWASP Mobile Top 10 (2024)، ذخیرهسازی ناامن دادهها رایجترین آسیبپذیری در برنامههای موبایل باقی مانده است. در این مقاله به بررسی تهدیدهای اصلی، روشهای رمزنگاری، ذخیرهسازی امن، احراز هویت و حفاظت از کد میپردازیم — همه چیزهایی که یک توسعهدهنده مبتدی باید بداند.
نکات کلیدی
OWASP (Open Web Application Security Project) یک سازمان غیرانتفاعی است که رتبهبندی خطرناکترین آسیبپذیریهای امنیت موبایل را منتشر میکند. OWASP Mobile Top 10 فهرستی است که به توسعهدهندگان کمک میکند بفهمند ابتدا روی چه چیزی تمرکز کنند. در نسخه ۲۰۲۴، مشکلات مربوط به ذخیرهسازی ناامن، احراز هویت ضعیف و ارتباطات شبکه ناامن در صدر رتبهبندی قرار دارند.
M1: ذخیرهسازی ناامن دادهها — رایجترین مشکل: رمزهای عبور، توکنها و دادههای شخصی بدون رمزنگاری در SharedPreferences، NSUserDefaults یا فایلهای محلی باقی میمانند. M2: احراز هویت ضعیف — عدم تأیید سمت سرور، رمزهای عبور ضعیف. M3: ارتباطات شبکه ناامن — عدم HTTPS یا تأیید نادرست گواهی SSL. M4 و M5 به رمزنگاری و استفاده نادرست از API مربوط میشوند.
M6: مجوزدهی ناامن — کاربر میتواند با جایگزینی ID در یک درخواست به دادههای کاربر دیگر دسترسی پیدا کند. M7: تزریق کد (SQL Injection، XSS). M8: دستکاری برنامه — بستهبندی مجدد، جایگزینی کد. M9 و M10 — نشت دادهها از طریق کتابخانههای شخص ثالث و مهندسی معکوس. برای هر یک از این تهدیدها اقدامات متقابل اثبات شدهای وجود دارد و در IT Sectr از سال ۲۰۱۷ آنها را در همه پروژهها اعمال میکنیم.
حمله MITM زمانی رخ میدهد که مهاجم ترافیک بین برنامه و سرور را رهگیری میکند. این کار از طریق جعل DNS، ARP spoofing یا اتصال به شبکه Wi-Fi ناامن امکانپذیر است. برای محافظت از گواهیهای SSL/TLS و Certificate Pinning استفاده میشود.
Certificate Pinning مکانیزمی است که در آن برنامه تأیید میکند که گواهی سرور با گواهی ذخیره شده قبلی در کد برنامه مطابقت دارد. حتی اگر مهاجم گواهی را از طریق یک پروکسی (مثلاً Burp Suite) جایگزین کند، برنامه اتصال را رد میکند. Pinning دو نوع است: Public Key Pinning و Certificate Hash Pinning.
AES (Advanced Encryption Standard) یک الگوریتم رمزنگاری متقارن است، اساس امنیت دادهها در دستگاه. AES از همان کلید برای رمزگذاری و رمزگشایی دادهها استفاده میکند. AES از کلیدهای ۱۲۸، ۱۹۲ یا ۲۵۶ بیتی پشتیبانی میکند. در توسعه موبایل، AES-256 برای رمزگذاری دادهها در دستگاه استفاده میشود: فایلها، حافظه پنهان، رکوردها در پایگاه داده محلی.
حالتهای AES: GCM (توصیه میشود) — احراز هویت داده را فراهم میکند، CBC — حالت پایه با زنجیرهسازی بلوک، ECB — ناامن، از آن استفاده نکنید. برای iOS، AES از طریق CommonCrypto (CCOptions) در دسترس است، برای Android — از طریق Cipher در Java Cryptography Architecture (JCA). مهم: کلید رمزنگاری هرگز نباید در کد برنامه ذخیره شود — از Keychain/Keystore استفاده کنید.
رمزنگاری نامتقارن: RSA — از یک جفت کلید (عمومی و خصوصی) استفاده میکند. RSA برای رمزگذاری مقادیر کوچک داده استفاده میشود — معمولاً برای تبادل کلید متقارن بین مشتری و سرور. حداقل طول کلید RSA ۲۰۴۸ بیت است (۴۰۹۶ توصیه میشود). در iOS، RSA از طریق Security Framework (SecKeyCreateRandomKey) در دسترس است، در Android — از طریق KeyPairGenerator در Android Keystore.
هش (SHA-256، SHA-3) تبدیل غیرقابل برگشت دادهها به یک رشته با طول ثابت است. هشها برای تأیید یکپارچگی دادهها و ذخیره رمزهای عبور استفاده میشوند. برای رمزهای عبور، حتماً از bcrypt، scrypt یا Argon2 استفاده کنید — SHA-256 ساده در برابر حملات جدول رنگینکمان آسیبپذیر است. SSL/TLS پروتکلی برای رمزگذاری ترافیک شبکه بین مشتری و سرور است. استاندارد مدرن TLS 1.3 است که Perfect Forward Secrecy (PFS) را فراهم میکند.
TLS 1.3 سریعتر از نسخههای قبلی است: دست دادن (handshake) یک دور رفت و برگشت طول میکشد به جای دو دور. در Android، حداقل نسخه TLS از طریق SSLSocket پیکربندی میشود، در iOS — از طریق ATS (App Transport Security)، که به طور پیشفرض به TLS 1.2 یا بالاتر نیاز دارد. ATS فقط برای دامنههای خاص با توجیه قابل غیرفعالسازی است.
Keychain (حلقه کلید) یک ذخیرهگاه امن در iOS / macOS برای رمزهای عبور، کلیدهای رمزنگاری، گواهیها و توکنها است. دادههای موجود در Keychain با یک کلید سختافزاری منحصربهفرد برای هر دستگاه رمزگذاری میشوند. دسترسی به Keychain از طریق Security Framework (SecItemAdd، SecItemCopyMatching) کنترل میشود. Keychain به طور خودکار هنگام قفل شدن دستگاه قفل میشود و با استفاده از Secure Enclave رمزگذاری میشود.
Android Keystore یک ذخیرهگاه سیستمی برای کلیدهای رمزنگاری است که از برنامه جدا شده است. از Android 6.0 (API 23) به بعد، Keystore از پشتیبانی سختافزاری (TEE — Trusted Execution Environment) در دستگاههای دارای تراشه امنیتی استفاده میکند. کلیدهای موجود در Keystore هرگز منطقه امن را ترک نمیکنند — برنامه فقط یک دسته (handle) برای عملیات رمزگذاری و امضا دریافت میکند.
| پارامتر | iOS Keychain | Android Keystore |
|---|---|---|
| نوع دادههای ذخیره شده | رمزهای عبور، توکنها، کلیدها، گواهیها | کلیدهای رمزنگاری |
| پشتیبانی سختافزاری | Secure Enclave (همه iPhone با A7+) | TEE (Android 6+، بستگی به تراشه دارد) |
| رمزنگاری | AES-256 سختافزاری | AES/GCM با کلید سختافزاری |
| بیومتریک | Face ID / Touch ID برای دسترسی | BiometricPrompt برای دسترسی |
| iCloud / پشتیبانگیری | همگامسازی از طریق iCloud Keychain | با ابر همگامسازی نمیشود |
| عملکرد | کندتر (رمزنگاری سختافزاری) | سریعتر (TEE) |
SharedPreferences و NSUserDefaults برای ذخیره دادههای حساس طراحی نشدهاند — آنها اطلاعات را به صورت متن ساده ذخیره میکنند. برای محافظت از دادهها، از EncryptedSharedPreferences (Android) استفاده کنید یا دادهها را قبل از ذخیره در UserDefaults (iOS) رمزگذاری کنید. در IT Sectr، ما همیشه از Keychain و Keystore برای توکنهای دسترسی و رمزهای عبور استفاده میکنیم.
OAuth 2.0 یک پروتکل مجوزدهی نیابتی است که دسترسی امن به منابع کاربر را بدون انتقال رمز عبور فراهم میکند. در برنامههای موبایل، بیشتر از Authorization Code Flow با PKCE (Proof Key for Code Exchange) استفاده میشود. PKCE از رهگیری کد مجوز جلوگیری میکند — یک الزام اجباری برای برنامههای موبایل.
OpenID Connect (OIDC) یک افزونه بر روی OAuth 2.0 برای احراز هویت کاربر است. OIDC یک ID Token با فرمت JWT اضافه میکند که حاوی اطلاعات کاربر (نام، ایمیل، شناسه) است. جریان OAuth 2.0 + OIDC شامل موارد زیر است: هدایت کاربر به صفحه ورود، دریافت کد مجوز، مبادله کد با توکنها (access + refresh + id)، استفاده از توکن دسترسی برای درخواستهای API.
JWT (JSON Web Token) یک فرمت توکن جمعوجور و امن برای URL است که حاوی ادعاهایی (claims) با فرمت JSON است. JWT از سه بخش تشکیل شده است: سرآیند (نوع و الگوریتم امضا)، محموله (payload) (داده) و امضا. توکن دسترسی یک توکن کوتاهمدت (۱۵-۶۰ دقیقه) برای دسترسی به API است. توکن تازهسازی یک توکن بلندمدت (روزها/هفتهها) برای دریافت توکن دسترسی جدید بدون ورود مجدد است.
توکن جلسه یک رویکرد سنتی است که در آن سرور جلسه را در پایگاه داده یا Redis ذخیره میکند و مشتری یک شناسه تصادفی دریافت میکند. در توسعه موبایل، JWT ترجیح داده میشود: به ذخیره جلسه سمت سرور نیاز ندارد، تمام اطلاعات را در خود دارد و به راحتی قابل تأیید است. با این حال، JWT را نمیتوان فوراً لغو کرد — این یک مصالحه است که با عمر کوتاه توکن دسترسی و استفاده از توکنهای تازهسازی حل میشود.
Face ID و Touch ID در iOS، احراز هویت اثر انگشت در Android — روشهای احراز هویت بیومتریک که از ویژگیهای فیزیکی منحصربهفرد کاربر استفاده میکنند. در iOS، بیومتریک از طریق LocalAuthentication (LAContext) کار میکند، در Android — از طریق BiometricPrompt (Android 9+) یا FingerprintManager (منسوخ شده). بیومتریک برای باز کردن قفل برنامه، تأیید پرداختها و دسترسی به دادههای محافظت شده استفاده میشود.
نکات مهم: بیومتریک یک تجربه کاربری راحت است، اما جایگزینی برای احراز هویت سرور نیست. پس از تأیید بیومتریک موفق، برنامه باید یک توکن دسترسی از سرور دریافت کند. در Android، حتماً بررسی کنید که دستگاه از بیومتریک کلاس ۳ (قوی) استفاده میکند، نه فقط تشخیص چهره مبتنی بر دوربین (کلاس ۱).
ProGuard ابزاری برای مبهمسازی، فشردهسازی و بهینهسازی بایتکد Java برای Android است که امنیت کد را در برابر مهندسی معکوس افزایش میدهد. R8 جانشین آن است، از Android Studio 3.4 در Gradle جاسازی شده است. R8 چهار وظیفه را انجام میدهد: فشردهسازی (کلاسها و روشهای استفاده نشده را حذف میکند)، بهینهسازی (روشها را درونخطی میکند، کد را ساده میکند)، مبهمسازی (کلاسها و روشها را به نامهای کوتاه تغییر نام میدهد) و پیشتأیید (بررسی بایتکد).
DexGuard یک نسخه تجاری از ProGuard با حفاظت پیشرفته است: رمزگذاری رشتهها، مبهمسازی منابع، محافظت در برابر بستهبندی مجدد، کنترل یکپارچگی APK. برای بیشتر پروژهها، R8 کافی است، اما برای برنامههای مالی و بانکی، DexGuard یک لایه امنیتی اضافی فراهم میکند. R8 از طریق build.gradle فعال میشود: minifyEnabled = true و proguardFiles.
Root Detection (Android) و Jailbreak Detection (iOS) مکانیزمهایی هستند که بررسی میکنند آیا مجوزهای فوقکاربر در دستگاه به دست آمده است یا خیر. در دستگاههای به خطر افتاده، میتوان حافظه فرآیند را خواند، ترافیک را رهگیری کرد و کد را جایگزین کرد. برای بررسی در Android، وجود فایل باینری SU، کلیدهای امضای آزمایشی و پرچمهای ساخت غیراستاندارد استفاده میشود.
RASP (Runtime Application Self-Protection) فناوری است که از برنامه در طول اجرا محافظت میکند. RASP تلاشهای اشکالزدایی، بستهبندی مجدد، تزریق کد را شناسایی میکند و هنگام تشخیص تهدیدها برنامه را خاتمه میدهد. نمونههایی از راهحلهای RASP: Dexter، Guardsquare، Promon. RASP در زمان اجرا کار میکند و به ناهنجاریها واکنش نشان میدهد — برخلاف مبهمسازی ایستا که از کد قبل از اجرا محافظت میکند.
مهندسی معکوس فرآیند بازیابی کد منبع از یک برنامه کامپایل شده است. ابزارها: JADX (دیکامپایلر APK)، Ghidra، IDA Pro، Hopper. محافظت در برابر مهندسی معکوس ترکیبی از مبهمسازی، رمزگذاری رشتهها، بررسی یکپارچگی و Root Detection است. حفاظت کامل وجود ندارد — هدف این است که مهندسی معکوس را برای مهاجم به اندازه کافی پرهزینه کنیم.
سؤالات متداول
با OWASP Mobile Top 10 شروع کنید — این یک نقشه راه از رایجترین آسیبپذیریها است. سپس HTTPS و گواهیهای SSL را مطالعه کنید، Certificate Pinning را پیکربندی کنید و به ذخیرهسازی امن از طریق Keychain / Keystore بروید.
AES (متقارن) — یک کلید برای رمزگذاری و رمزگشایی، سریع، مناسب برای حجمهای زیاد داده. RSA (نامتقارن) — یک جفت کلید (عمومی و خصوصی)، کندتر، برای تبادل کلید متقارن استفاده میشود.
شما باید فقط دادههای محرمانه را رمزگذاری کنید: رمزهای عبور، توکنها، دادههای شخصی کاربر، اطلاعات پرداخت. تصاویر، متون و تنظیمات رابط کاربری نیاز به رمزگذاری ندارند — این کار اندازه را افزایش میدهد و برنامه را کند میکند.
توکن تازهسازی یک توکن بلندمدت است که به شما امکان میدهد بدون وارد کردن مجدد رمز عبور، یک توکن دسترسی جدید دریافت کنید. این امنیت را افزایش میدهد — توکن دسترسی ۱۵-۶۰ دقیقه عمر میکند و حتی اگر نشت کند، مهاجم نمیتواند برای مدت طولانی از آن استفاده کند.
بله، R8 باید برای نسخههای انتشار Android فعال شود. این نه تنها محافظت در برابر مهندسی معکوس است، بلکه کاهش اندازه APK و بهینهسازی عملکرد است. بدون R8، کد شما با یک دستور JADX به شکل قابل خواندن دیکامپایل میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.