Secure Storage (ذخیرهسازی امن) — مجموعهای از روشها و فناوریها برای محافظت از دادههای محرمانه روی دستگاه: توکنها، کلیدهای رمزنگاری، اطلاعات پرداخت و دادههای شخصی کاربران. بر اساس OWASP Mobile Top 10 (2024)، ذخیرهسازی ناایمن دادهها در میان سه ریسک بحرانی اول قرار دارد. پیادهسازی صحیح ذخیرهسازی امن حتی با دسترسی فیزیکی به دستگاه از نشت دادهها جلوگیری میکند.
نکات کلیدی
Secure Storage — روش ذخیرهسازی دادههای محرمانه برنامه موبایل بهگونهای که برای سایر برنامهها، بدافزارها و مهاجم با دسترسی فیزیکی به دستگاه غیرقابل دسترس باشند. برخلاف ذخیرهسازی معمولی، Secure Storage از رمزنگاری، ایزولهسازی و حفاظت سختافزاری استفاده میکند.
همه دادهها به Secure Storage نیاز ندارند: تصاویر پروفایل یا کش اخبار را میتوان در سیستم فایل معمولی ذخیره کرد. اما کلیدهای رمزنگاری، توکنهای احراز هویت، دادههای پرداخت، کلیدهای خصوصی و الگوهای بیومتریک باید محافظت شوند. طبق Google Security Blog (2025)، ۶۷٪ آسیبپذیریها در برنامههای موبایل به ذخیرهسازی اسرار به صورت آشکار مرتبط است.
هر پلتفرم موبایل مکانیزمهای Secure Storage خود را ارائه میدهد: Android — Keystore و EncryptedSharedPreferences، iOS — Keychain و Data Protection API. این مکانیزمها با ماژولهای امنیتی سختافزاری (TEE، Secure Enclave) یکپارچه شدهاند و تضمین میکنند که دادهها حتی در صورت jailbreak یا root شدن دستگاه قابل خواندن نیستند.
انتخاب صحیح روش Secure Storage به نوع داده، سناریوی استفاده و الزامات عملکرد بستگی دارد. درک معماری هر مکانیزم به توسعهدهنده اجازه میدهد تصمیم معماری درستی بگیرد.
پلتفرم Android چندین سطح حفاظت از داده را ارائه میدهد، از مخزن کلید سختافزاری تا SharedPreferences رمزنگاریشده. انتخاب به حساسیت دادهها و الزامات عملکرد بستگی دارد.
Android Keystore — ارائهدهنده رمزنگاری که کلیدها را در محیط اجرای ایزوله (TEE — Trusted Execution Environment) در دستگاههای پشتیبانیکننده از حفاظت سختافزاری تولید و ذخیره میکند. کلیدها هرگز TEE را ترک نمیکنند: عملیات رمزنگاری درون ناحیه محافظتشدهای انجام میشود که حتی برای سیستمعامل نیز غیرقابل دسترس است.
از Android 9 (API 28) Keystore از StrongBox Keymaster پشتیبانی میکند — تراشه امنیتی اختصاصی با CPU اختصاصی، مولد اعداد تصادفی واقعی (TRNG) و حافظه محافظتشده. StrongBox مطابق با Common Criteria EAL 4+ گواهی شده است و امنترین سطح ذخیرهسازی کلیدها در Android است. برای استفاده از StrongBox باید پرچم inStrongBox() را هنگام تولید کلید به صراحت مشخص کنید.
Keystore از الگوریتمهای زیر پشتیبانی میکند: AES/GCM/NoPadding (۲۵۶ بیت)، EC (secp256r1، secp384r1)، RSA (۲۰۴۸–۴۰۹۶ بیت) و HMAC-SHA256. همه کلیدها میتوانند از طریق setUserAuthenticationRequired(true) به احراز هویت بیومتریک متصل شوند.
EncryptedSharedPreferences — کتابخانه از بسته AndroidX Security که به طور خودکار تمام دادههای ذخیرهشده از طریق API SharedPreferences را رمزنگاری میکند. مقادیر با کلید AES-256 GCM و کلیدها با AES-256 SIV (IV مصنوعی) رمزنگاری میشوند که از حملات فرهنگ لغت بر روی نام کلیدها جلوگیری میکند.
کلید اصلی رمزنگاری در Android Keystore ذخیره میشود و حفاظت دو سطحی را فراهم میکند: Keystore از کلید اصلی محافظت میکند، EncryptedSharedPreferences از دادهها. عملکرد رمزنگاری برای دادههای معمولی (توکن، تنظیمات) کمتر از ۵ میلیثانیه در هر عملیات خواندن/نوشتن است که کتابخانه را برای سناریوهای کاربری مناسب میسازد.
EncryptedSharedPreferences برای حجمهای زیاد داده (بیش از ۵ مگابایت) طراحی نشده است — در این موارد از پایگاه داده رمزنگاریشده از طریق SQLCipher یا Room با رمزنگاری استفاده کنید.
SQLCipher — افزونه SQLite که کل پایگاه داده را صفحه به صفحه با AES-256-CBC رمزنگاری میکند. هر صفحه از پایگاه داده با کلید جداگانهای که از رمز عبور اصلی از طریق PBKDF2 مشتق شده رمزنگاری میشود. SQLCipher بسته به اندازه داده حدود ۵–۱۵٪ سربار عملکرد اضافه میکند.
ادغام با Android از طریق کتابخانه net.zetetic:android-database-sqlcipher انجام میشود که API سازگار با SQLiteOpenHelper استاندارد ارائه میدهد. توصیه میشود رمز عبور SQLCipher را در Keystore ذخیره کنید، نه در کد یا SharedPreferences.
پلتفرم iOS Keychain Services — مخزن امن اصلی، و همچنین Data Protection API برای رمزنگاری فایلها در سطح سیستمعامل را ارائه میدهد.
Keychain — پایگاه داده SQLite رمزنگاریشدهای است که iOS رمزهای عبور، کلیدهای رمزنگاری، گواهیها و یادداشتها را در آن ذخیره میکند. هر عنصر Keychain (SecItem) با استفاده از یک کلید سختافزاری منحصربهفرد برای دستگاه به صورت رمزنگاریشده ذخیره میشود. دسترسی به عنصر از طریق ACL (Access Control List) کنترل میشود که ممکن است به احراز هویت بیومتریک (Face ID، Touch ID) یا رمز عبور نیاز داشته باشد.
Keychain از کلاسهای حفاظتی (Protection Class) پشتیبانی میکند که مشخص میکنند دادهها چه زمانی در دسترس هستند: kSecAttrAccessibleWhenUnlockedThisDeviceOnly — دادهها فقط در زمانی که دستگاه باز است در دسترس هستند و در پشتیبانگیری کپی نمیشوند. این کلاس برای اکثر سناریوهای ذخیره توکنهای احراز هویت توصیه میشود.
در iOS 15+، Security framework با پشتیبانی از کلیدهای سختافزاری از طریق Secure Enclave در دسترس است — پردازنده اختصاصی Apple که عملیات رمزنگاری را پردازش میکند و کلیدهای خصوصی را در حافظه ایزوله ذخیره میکند. Secure Enclave از الگوریتمهای ECDSA (secp256r1) و ECDH برای تولید کلیدهایی که قابل استخراج از تراشه نیستند پشتیبانی میکند.
Data Protection — مکانیزم iOS که هر فایل را در سطح سیستم فایل (APFS) با استفاده از کلیدی وابسته به رمز عبور دستگاه رمزنگاری میکند. توسعهدهنده سطح حفاظت را از طریق ویژگی NSFileProtectionType هنگام ایجاد فایل مشخص میکند: NSFileProtectionComplete — فایل فقط هنگام باز بودن دستگاه در دسترس است.
Data Protection به طور خودکار در تمام دستگاههای دارای iOS 5+ در صورت تنظیم رمز عبور کار میکند. رمزنگاری در سطح سختافزاری از طریق Dedicated AES Engine پردازنده Apple انجام میشود که عملکرد بالایی را تضمین میکند — تأخیر رمزنگاری برای کاربر عملاً نامحسوس است. برای فعالسازی حفاظت در برنامه، کافی است هنگام ایجاد فایل از طریق FileManager ویژگی حفاظت را تنظیم کنید.
Data Protection جایگزین Keychain برای ذخیره کلیدها نمیشود — برای رمزنگاری فایلها، پایگاههای داده Core Data و سایر حجمهای زیاد داده استفاده میشود. ترکیب Keychain (برای کلیدها) و Data Protection (برای فایلها) چرخه کامل ذخیرهسازی امن در iOS را فراهم میکند.
بیایید نمونههای عملی Secure Storage را با استفاده از APIهای داخلی Android و iOS بررسی کنیم.
نمونه راهاندازی EncryptedSharedPreferences با کلید اصلی از Android Keystore را نشان میدهد. تمام عملیات بعدی خواندن و نوشتن به طور خودکار رمزنگاری و رمزگشایی میشوند.
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val prefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
prefs.edit()
.putString("auth_token", "eyJhbGciOiJIUzI1NiJ9...")
.apply()
نمونه ذخیره و خواندن دادهها از iOS Keychain را با استفاده از Security framework نشان میدهد. کد از kSecAttrAccessibleWhenUnlockedThisDeviceOnly برای حداکثر حفاظت استفاده میکند.
import Security
func saveToKeychain(key: String, data: Data) {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecValueData as String: data,
kSecAttrAccessible as String:
kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary)
SecItemAdd(query as CFDictionary, nil)
}
func readFromKeychain(key: String) -> Data? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: true,
kSecMatchLimit as String: kSecMatchLimitOne
]
var result: AnyObject?
let status = SecItemCopyMatching(
query as CFDictionary, &result
)
return status == errSecSuccess ? result as? Data : nil
}
نمونه اتصال به پایگاه داده SQLite رمزنگاریشده از طریق SQLCipher با رمز عبور ذخیرهشده در Android Keystore.
import net.sqlcipher.database.SQLiteDatabase
import net.sqlcipher.database.SQLiteOpenHelper
class SecureDBHelper(context: Context) :
SQLiteOpenHelper(context, "secure.db", null, 1) {
private val password = getKeyFromKeystore()
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("CREATE TABLE tokens (id INTEGER PRIMARY KEY, value TEXT)")
}
override fun onUpgrade(
db: SQLiteDatabase, oldVersion: Int, newVersion: Int
) {
onCreate(db)
}
}
// استفاده: هنگام باز کردن رمز عبور را وارد کنید
val helper = SecureDBHelper(context)
val db = helper.getWritableDatabase(password)
استفاده صحیح از Secure Storage مستلزم رعایت چند اصل اساسی است که از اشتباهات رایج توسعهدهندگان جلوگیری میکند.
طبقهبندی دادهها را تعیین کنید: کدام دادهها به حفاظت سختافزاری (Keystore / Secure Enclave)، کدام به رمزنگاری در سطح سیستمعامل (EncryptedSharedPreferences / Data Protection) و کدام را میتوان در سیستم فایل معمولی ذخیره کرد. توکنهای احراز هویت، کلیدهای خصوصی و دادههای پرداخت — فقط سطح سختافزاری. تنظیمات کاربر (پوسته، زبان) — EncryptedSharedPreferences کافی است. دادههای جلسه (کشهای موقت) میتوانند در حافظه یا دایرکتوری موقت ذخیره شوند.
هرگز اسرار را در کد ذخیره نکنید: رشتههای حاوی کلیدهای API، رمزهای عبور یا عبارات seed در کد منبع — بزرگترین اشتباه امنیتی. هر reverse engineering فوراً این دادهها را آشکار میکند. برای کلیدها از Keystore و برای پیکربندی از بارگذاری سرور هنگام راهاندازی برنامه (remote config) استفاده کنید.
برای عملیات بحرانی از اتصال بیومتریک استفاده کنید: Android Keystore و iOS Keychain از اتصال کلیدها به احراز هویت بیومتریک پشتیبانی میکنند. در هر بار دسترسی به کلید، سیستم Face ID، Touch ID یا بیومتریک Android (BiometricPrompt) را درخواست میکند. این تضمین میکند که حتی با کنترل کامل دستگاه، مهاجم نمیتواند از دادههای ذخیرهشده بدون مالک استفاده کند.
حفاظت را آزمایش کنید: از ابزارهای تحلیل امنیتی استفاده کنید — MobSF (Mobile Security Framework) برای تحلیل ایستا، objection برای تست runtime و Frida برای دور زدن حفاظت. بررسی کنید که دادهها پس از root یا jailbreak غیرقابل دسترس هستند. Android به شما امکان میدهد وجود root را از طریق SafetyNet Attestation یا Play Integrity API بررسی کنید، iOS — از طریق بررسی یکپارچگی Secure Enclave.
کتابخانههای رمزنگاری را مرتباً بهروز کنید: آسیبپذیریها در کتابخانههای رمزنگاری مرتباً کشف میشوند. CVEها را برای AndroidX Security، SQLCipher و wrapperهای Keychain پیگیری کنید. یک سیستم اعلان خودکار برای نسخههای جدید از طریق Dependabot یا Renovate پیادهسازی کنید.
طبق Apple Security Research (2025)، پیادهسازی صحیح Secure Storage از ۹۶٪ حملات با هدف سرقت داده از دستگاه جلوگیری میکند. ۴٪ باقیمانده — حملات با دسترسی فیزیکی و اکسپلویتهای روز صفر که اتصال بیومتریک در برابر آنها مؤثر است.
سوالات متداول
iOS Keychain — پایگاه داده رمزنگاریشده برای ذخیره رمزهای عبور، کلیدها و گواهیها با کنترل دسترسی از طریق ACL. Android Keystore — ارائهدهنده رمزنگاری که کلیدها را در محیط ایزوله (TEE/StrongBox) تولید و ذخیره میکند و اجازه استخراج کلید خصوصی را نمیدهد.
EncryptedSharedPreferences برای رمزنگاری مقادیر از AES-256 GCM و برای رمزنگاری کلیدها از AES-256 SIV استفاده میکند. کلید اصلی در Android Keystore ذخیره میشود و حفاظت دو سطحی را فراهم میکند. علاوه بر این از HMAC-SHA256 برای بررسی یکپارچگی استفاده میشود.
بله، HTTPS فقط از دادهها در کانال انتقال محافظت میکند. روی دستگاه، دادهها پس از رمزگشایی به صورت آشکار ذخیره میشوند. اگر مهاجم به دستگاه دسترسی فیزیکی پیدا کند یا بدافزار نصب کند، HTTPS از دادههای ذخیرهشده محافظت نخواهد کرد. همیشه دادهها را در سطح ذخیرهسازی رمزنگاری کنید.
از Android Keystore با پرچم setUnlockedDeviceRequired(true) استفاده کنید که دسترسی به کلیدها را در دستگاههای root شده مسدود میکند. علاوه بر این یکپارچگی را از طریق Play Integrity API بررسی کنید و در صورت انحراف از مقادیر مرجع، تمام اسرار را از مخزن پاک کنید.
خیر، UserDefaults دادهها را به صورت آشکار در فایل plist داخل sandbox ذخیره میکند. هر برنامهای با ابزارهای reverse engineering (از طریق پشتیبانگیری یا jailbreak) میتواند توکنها را بخواند. تنها Keychain — تنها مکان امن برای ذخیره اسرار در iOS است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید