Secure Storage, bir cihazdaki gizli verileri (token’lar, şifreleme anahtarları, ödeme bilgileri ve kullanıcıların kişisel verileri) korumak için bir yöntem ve teknoloji kümesidir. OWASP Mobile Top 10 (2024)’a göre, güvensiz veri depolama en kritik üç risk arasındadır. Güvenli depolamanın doğru şekilde uygulanması, cihaza fiziksel erişim olsa bile veri sızıntısını önler.
Ana Noktalar
Secure Storage, mobil uygulama gizli verilerini diğer uygulamalardan, kötü amaçlı yazılımlardan ve cihaza fiziksel erişimi olan saldırganlardan erişilemez şekilde saklama uygulamasıdır. Normal depolamanın aksine, Secure Storage şifreleme, yalıtım ve donanım koruması kullanır.
Tüm veriler Secure Storage gerektirmez: profil resimleri veya haber önbelleği normal dosya sisteminde saklanabilir. Ancak şifreleme anahtarları, kimlik doğrulama token’ları, ödeme verileri, özel anahtarlar ve biyometrik şablonlar korunmalıdır. Google Security Blog (2025)’a göre, mobil uygulamalardaki güvenlik açıklarının %67’si sırların düz metin olarak saklanmasıyla ilgilidir.
Her mobil platform kendi Secure Storage mekanizmalarını sağlar: Android — Keystore ve EncryptedSharedPreferences, iOS — Keychain ve Data Protection API. Bu mekanizmalar donanım güvenlik modülleriyle (TEE, Secure Enclave) entegredir ve cihaz jailbreak veya root edildikten sonra bile verilerin okunamayacağını garanti eder.
Doğru Secure Storage yöntemi seçimi, veri türüne, kullanım senaryosuna ve performans gereksinimlerine bağlıdır. Her mekanizmanın mimarisini anlamak, geliştiricinin doğru mimari kararı vermesini sağlar.
Android platformu, donanım anahtar depolamadan şifrelenmiş SharedPreferences’a kadar çeşitli veri koruma düzeyleri sunar. Seçim, verinin hassasiyetine ve performans gereksinimlerine bağlıdır.
Android Keystore, donanım korumasını destekleyen cihazlarda izole bir yürütme ortamında (TEE — Trusted Execution Environment) anahtarları oluşturan ve saklayan kriptografik bir sağlayıcıdır. Anahtarlar asla TEE’den ayrılmaz: kriptografik işlemler, işletim sisteminin bile erişemeyeceği korumalı bir alan içinde gerçekleştirilir.
Android 9’dan (API 28) itibaren Keystore, StrongBox Keymaster’ı destekler — kendi CPU’su, Gerçek Rastgele Sayı Üreteci (TRNG) ve korumalı belleği olan özel bir güvenlik çipi. StrongBox, Common Criteria EAL 4+ uyumlu olarak sertifikalandırılmıştır ve Android’de en yüksek anahtar depolama güvenliği seviyesidir. StrongBox’ı kullanmak için anahtar oluştururken inStrongBox() bayrağını açıkça belirtmelisiniz.
Keystore şu algoritmaları destekler: AES/GCM/NoPadding (256 bit), EC (secp256r1, secp384r1), RSA (2048–4096 bit) ve HMAC-SHA256. Tüm anahtarlar setUserAuthenticationRequired(true) aracılığıyla biyometrik kimlik doğrulamaya bağlanabilir.
EncryptedSharedPreferences, AndroidX Security paketinden, SharedPreferences API aracılığıyla kaydedilen tüm verileri otomatik olarak şifreleyen bir kütüphanedir. Değerler bir AES-256 GCM anahtarıyla şifrelenir ve anahtarlar AES-256 SIV (sentetik IV) ile şifrelenir, bu da anahtar adlarına sözlük saldırılarını önler.
Ana şifreleme anahtarı Android Keystore’da saklanarak iki düzeyli koruma sağlar: Keystore ana anahtarı korur, EncryptedSharedPreferences verileri korur. Tipik veriler (token, ayarlar) için okuma/yazma işlemi başına şifreleme performansı 5 ms’nin altındadır ve bu da kütüphaneyi kullanıcı senaryoları için uygun hale getirir.
EncryptedSharedPreferences büyük veri hacimleri (5 MB’tan fazla) için tasarlanmamıştır — bunlar için SQLCipher veya şifrelemeli Room aracılığıyla şifrelenmiş bir veritabanı kullanın.
SQLCipher, AES-256-CBC kullanarak tüm veritabanını sayfa sayfa şifreleyen SQLite’ın bir uzantısıdır. Veritabanının her sayfası, PBKDF2 aracılığıyla ana paroladan türetilen ayrı bir anahtarla şifrelenir. SQLCipher, veri boyutuna bağlı olarak yaklaşık %5–15 performans yükü ekler.
Android ile entegrasyon, standart SQLiteOpenHelper ile uyumlu bir API sağlayan net.zetetic:android-database-sqlcipher kütüphanesi aracılığıyla yapılır. SQLCipher için parola, kodda veya SharedPreferences’da değil, Keystore’da saklanmalıdır.
iOS platformu, ana güvenli depolama olarak Keychain Services’i ve işletim sistemi düzeyinde dosya şifreleme için Data Protection API’sini sağlar.
Keychain, iOS’un parolaları, şifreleme anahtarlarını, sertifikaları ve notları sakladığı şifrelenmiş bir SQLite veritabanıdır. Her Keychain öğesi (SecItem), cihaza özel bir donanım anahtarı kullanılarak şifrelenmiş biçimde saklanır. Bir öğeye erişim, biyometrik kimlik doğrulama (Face ID, Touch ID) veya bir parola gerektirebilen bir ACL (Erişim Kontrol Listesi) aracılığıyla kontrol edilir.
Keychain, verilere ne zaman erişilebileceğini belirleyen koruma sınıflarını destekler: kSecAttrAccessibleWhenUnlockedThisDeviceOnly — verilere yalnızca cihazın kilidi açıkken erişilebilir ve yedekleme sırasında aktarılmaz. Bu sınıf, çoğu kimlik doğrulama token’ı depolama senaryosu için önerilir.
iOS 15+ üzerinde, Security framework, Secure Enclave aracılığıyla donanım anahtar desteğiyle kullanılabilir — kriptografik işlemleri yöneten ve özel anahtarları izole bellekte saklayan özel bir Apple işlemcisi. Secure Enclave, çipten çıkarılamayan anahtarlar oluşturmak için ECDSA (secp256r1) ve ECDH algoritmalarını destekler.
Data Protection, cihaz parolasına bağlı bir anahtar kullanarak dosya sistemi düzeyinde (APFS) her dosyayı şifreleyen bir iOS mekanizmasıdır. Geliştirici, dosya oluştururken NSFileProtectionType özelliği aracılığıyla koruma düzeyini belirtir: NSFileProtectionComplete — dosyaya yalnızca cihazın kilidi açıkken erişilebilir.
Data Protection, bir parola belirlenmişse iOS 5+ çalıştıran tüm cihazlarda otomatik olarak çalışır. Şifreleme, Apple’ın Dedicated AES Engine’i aracılığıyla donanım düzeyinde gerçekleştirilir ve yüksek performans sağlar — şifreleme gecikmesi kullanıcı için neredeyse fark edilmez. Bir uygulamada korumayı etkinleştirmek için FileManager aracılığıyla dosya oluştururken koruma özelliğini ayarlamak yeterlidir.
Data Protection, anahtar saklama için Keychain’in yerini almaz — dosyaları, Core Data veritabanlarını ve diğer büyük veri hacimlerini şifrelemek için kullanılır. Keychain (anahtarlar için) ve Data Protection (dosyalar için) kombinasyonu, iOS’ta tam bir güvenli depolama döngüsü sağlar.
Android ve iOS’un yerleşik API’lerini kullanarak Secure Storage’ın pratik örneklerine bakalım.
Örnek, Android Keystore’dan bir ana anahtarla EncryptedSharedPreferences’ın başlatılmasını gösterir. Sonraki tüm okuma ve yazma işlemleri otomatik olarak şifrelenir ve çözülür.
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()
Örnek, Security framework’ü kullanarak iOS Keychain’den veri kaydetmeyi ve okumayı gösterir. Kod, maksimum koruma için kSecAttrAccessibleWhenUnlockedThisDeviceOnly kullanır.
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
}
Android Keystore’da saklanan bir parolayla SQLCipher aracılığıyla şifrelenmiş bir SQLite veritabanına bağlanma örneği.
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)
}
}
// Kullanım: açılışta şifre veriyoruz
val helper = SecureDBHelper(context)
val db = helper.getWritableDatabase(password)
Secure Storage’un doğru kullanımı, yaygın geliştirici hatalarını önleyen birkaç temel ilkeyi izlemeyi gerektirir.
Veri sınıflandırmasını tanımlayın: hangi veriler donanım koruması (Keystore / Secure Enclave) gerektirir, hangileri işletim sistemi düzeyinde şifreleme (EncryptedSharedPreferences / Data Protection) gerektirir ve hangileri normal dosya sisteminde saklanabilir. Kimlik doğrulama token’ları, özel anahtarlar ve ödeme verileri — yalnızca donanım düzeyi. Kullanıcı ayarları (tema, dil) — EncryptedSharedPreferences yeterlidir. Oturum verileri (geçici önbellekler) bellekte veya geçici bir dizinde saklanabilir.
Sırları asla kodda saklamayın: kaynak koddaki API anahtarları, parolalar veya tohum ifadeleri içeren dizeler ciddi bir güvenlik hatasıdır. Herhangi bir tersine mühendislik bu verileri anında ifşa edecektir. Anahtarlar için Keystore’u ve yapılandırma için uygulama başlatılırken sunucu tarafı yüklemeyi (uzaktan yapılandırma) kullanın.
Kritik işlemler için biyometrik bağlama kullanın: Android Keystore ve iOS Keychain, anahtarları biyometrik kimlik doğrulamaya bağlamayı destekler. Bir anahtara her erişildiğinde, sistem Face ID, Touch ID veya Android biyometrisini (BiometricPrompt) ister. Bu, cihaz üzerinde tam kontrole sahip olsa bile bir saldırganın sahibi olmadan saklanan verileri kullanamayacağını garanti eder.
Güvenliği test edin: güvenlik analiz araçlarını kullanın — statik analiz için MobSF (Mobile Security Framework), çalışma zamanı testleri için objection ve korumayı atlatmak için Frida. Root veya jailbreak sonrası verilere erişilemediğini doğrulayın. Android, SafetyNet Attestation veya Play Integrity API aracılığıyla root erişimini kontrol etmeye izin verir, iOS — Secure Enclave bütünlük doğrulaması aracılığıyla.
Kriptografik kütüphaneleri düzenli olarak güncelleyin: şifreleme kütüphanelerindeki güvenlik açıkları düzenli olarak keşfedilir. AndroidX Security, SQLCipher ve Keychain sarmalayıcıları için CVE’leri izleyin. Dependabot veya Renovate aracılığıyla yeni sürümler için otomatik bir bildirim sistemi uygulayın.
Apple Security Research (2025)’e göre, Secure Storage’un doğru şekilde uygulanması, cihazdan veri hırsızlığını hedefleyen saldırıların %96’sını önler. Kalan %4’ü, fiziksel erişim ve sıfırıncı gün istismarları içeren saldırılardır ve bunlara karşı biyometrik bağlama etkilidir.
Sıkça Sorulan Sorular
iOS Keychain, ACL aracılığıyla erişim kontrolü ile parolaları, anahtarları ve sertifikaları saklamak için şifrelenmiş bir veritabanıdır. Android Keystore, izole bir ortamda (TEE/StrongBox) anahtarları oluşturan ve saklayan ve özel anahtarın çıkarılmasına izin vermeyen kriptografik bir sağlayıcıdır.
EncryptedSharedPreferences, değerleri şifrelemek için AES-256 GCM ve anahtarları şifrelemek için AES-256 SIV kullanır. Ana anahtar Android Keystore’da saklanarak iki düzeyli koruma sağlar. Ek olarak, bütünlük doğrulaması için HMAC-SHA256 kullanılır.
Evet, HTTPS verileri yalnızca iletim kanalında korur. Cihazda, veriler şifre çözüldükten sonra düz metin olarak saklanır. Bir saldırgan cihaza fiziksel erişim sağlar veya kötü amaçlı yazılım yüklerse, HTTPS saklanan verileri korumaz. Verileri her zaman depolama düzeyinde şifreleyin.
setUnlockedDeviceRequired(true) bayrağıyla Android Keystore’u kullanın, bu, root’lanmış cihazlarda anahtarlara erişimi engeller. Ayrıca, Play Integrity API aracılığıyla bütünlüğü doğrulayın ve referans değerlerden saparsa, depodaki tüm sırları temizleyin.
Hayır, UserDefaults verileri sandbox içindeki bir plist dosyasında düz metin olarak saklar. Tersine mühendislik araçlarına sahip herhangi bir uygulama (yedekleme veya jailbreak yoluyla) token’ları okuyabilir. iOS’ta sırları saklamak için tek güvenli yer yalnızca Keychain’dir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun