EncryptedSharedPreferences, SharedPreferences API aracılığıyla kaydedilen verilerin şeffaf şekilde şifrelenmesini sağlayan AndroidX Security kütüphanesinin bir bileşenidir. Verilerin düz bir XML dosyasında saklandığı normal SharedPreferences'ın aksine, EncryptedSharedPreferences diske yazmadan önce anahtarları ve değerleri otomatik olarak şifreler. Android Developers'a göre kütüphane, değerler için AES-256 GCM ve anahtarlar için AES-256 SIV (RFC 5297) kullanarak verilerin gizliliğini ve bütünlüğünü sağlar.
Önemli Noktalar
EncryptedSharedPreferences, androidx.security.crypto paketinden bir sınıftır ve AndroidX Security 1.0.0 (2019) ile tanıtılmıştır. SharedPreferences arayüzünü uygular, ancak tüm yazma işlemleri (putString, putInt, putBoolean, vb.) verileri önceden şifreler ve okuma işlemleri verileri döndürmeden önce şifresini çözer.
Standart SharedPreferences, uygulama dizinindeki (/data/data/package/shared_prefs/) bir XML dosyasına veri kaydeder. Dosya şifrelenmemiştir — cihaza root erişimi veya yedekleme analizi sırasında tüm veriler düz XML olarak okunabilir. Kimlik doğrulama token'ları, API anahtarları ve kullanıcının kişisel verileri saldırganın erişimine açık hale gelir.
EncryptedSharedPreferences bu sorunu kütüphane düzeyinde çözer: veriler diske yazılmadan önce şifrelenir ve okunduğunda şifresi çözülür. Geliştiricinin manuel olarak kriptografik işlevleri çağırması gerekmez — API normal SharedPreferences ile aynı kalır.
AndroidX Security kütüphanesi v1.0.0 Aralık 2019'da yayınlandı. EncryptedSharedPreferences, Cipher + SharedPreferences aracılığıyla manuel şifrelemenin eski yaklaşımının yerini aldı. Mevcut kararlı sürüm 1.1.0-alpha06'dır (2024) ve API 19+'yı destekler. Kütüphane Jetpack'in bir parçasıdır ve ek izin gerektirmez.
Google Security Blog (2024)'e göre EncryptedSharedPreferences, bulut senkronizasyonu gerektirmeyen hassas uygulama ayarlarını saklamak için önerilen yöntemdir. Daha karmaşık senaryolar için SQLCipher şifrelemesiyle Room önerilir.
EncryptedSharedPreferences iki seviyeli bir şifreleme şeması kullanır: Master Key, Android Keystore'da saklanır ve veri şifrelemesi için türetilmiş anahtarlar kullanılır. Bu, Keystore korumasını simetrik şifrelemenin performansıyla birleştirir.
Değerler için AES-256 GCM (Galois/Counter Mode) kullanılır — veri gizliliğini ve bütünlüğünü sağlayan kimlik doğrulamalı şifreleme modu (AEAD). Anahtarlar (parametre adları) için AES-256 SIV (RFC 5297) uygulanır — içeriğini açığa çıkarmadan anahtar araması için gerekli olan deterministik şifreleme.
EncryptedSharedPreferences'ın her dosyası şifrelenmiş anahtar-değer çiftleri içerir. Dosya yapısı şunları içerir: önce meta verilerle (sürüm, anahtar tanımlayıcı) bir başlık, ardından şifrelenmiş girdilerin bir listesi. Dosya geçerli bir XML değildir ve metin düzenleyicilerle okunamaz.
MasterKey sınıfı, Android Keystore'da saklanan 256 bitlik bir ana anahtarın oluşturulması ve yönetilmesinden sorumludur. MasterKey.Builder şunları yapılandırmaya olanak tanır: depolama türü (Keystore veya yazılım), biyometrik koruma ve anahtar ömrü. Varsayılan olarak ana anahtar, Android Keystore'da AES/GCM/NoPadding algoritmasıyla oluşturulur.
import androidx.security.crypto.MasterKey
import androidx.security.crypto.EncryptedSharedPreferences
fun getEncryptedPrefs() {
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.AES256_GCM_SPEC)
.build()
val prefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
}
EncryptedSharedPreferences.create beş parametre alır: bağlam, dosya adı, ana anahtar, anahtar şifreleme şeması ve değer şifreleme şeması. Şemaların seçimi performansı ve güvenlik seviyesini etkiler.
AES256_SIV — deterministik şifreleme: aynı anahtarlar her zaman aynı şifreli metni üretir. Bu, anahtar araması (SharedPreferences.getX(key)) için gereklidir. Dezavantajı: bir saldırgan, tekrarlanan şifreli metinleri karşılaştırarak hangi anahtarların kullanıldığını belirleyebilir. AES256_SIV2 — ek rastgeleleştirme ile geliştirilmiş bir sürüm.
Değerler için AES256_GCM kullanılır. GCM, her değere 12 baytlık bir IV (başlatma vektörü) ve 16 baytlık bir kimlik doğrulama etiketi ekler. Bu, gizlilik (hiç kimse değeri okuyamaz) ve kimlik doğrulama (hiç kimse fark edilmeden değeri değiştiremez) sağlar.
MasterKey.Builder'daki setUserAuthenticationRequired(true) yöntemi, ana anahtarı Keystore'dan almadan önce biyometrik onay gerektirir. Bu ek bir katman ekler: uygulama kilitlenmemiş bir cihazda çalışıyor olsa bile, bir saldırgan Face ID veya Touch ID olmadan EncryptedSharedPreferences'ı okuyamaz.
Önemli: setUserAuthenticationRequired ile kullanıcı biyometrik verilerini değiştirir veya silerse ana anahtar kullanılamaz hale gelir. KeyPermanentlyInvalidatedException'ı işlemek ve veri geçişiyle yeni bir ana anahtar oluşturmak gerekir.
fun createBiometricKey(): MasterKey {
return MasterKey.Builder(context)
.setKeyScheme(MasterKey.AES256_GCM_SPEC)
.setUserAuthenticationRequired(true)
.setRequestStrongBoxBacked(true)
.build()
}
fun writeSecureToken(token: String) {
try {
prefs.edit().putString("auth_token", token).apply()
} catch (e: KeyPermanentlyInvalidatedException) {
// Biyometri değişti — anahtarın yeniden oluşturulması gerekiyor
}
}
Kotlin kullanarak bir Android uygulamasında EncryptedSharedPreferences'ı entegre etmenin tam bir örneğine bakalım. androidx.security:security-crypto kütüphanesi Gradle aracılığıyla eklenir.
build.gradle (app) dosyasına ekleyin: implementation “androidx.security:security-crypto:1.1.0-alpha06”. Kotlin projeleri için kotlin-stdlib de gereklidir. MasterKey başlatması bir kez yapılır, genellikle Application.onCreate'da veya bir DI kapsayıcısı aracılığıyla.
EncryptedSharedPreferences örneği oluşturulduktan sonra API, normal SharedPreferences'dan farklı değildir. edit() bir Editor döndürür, tüm yöntemler (putString, getString, putBoolean, getBoolean) aynı şekilde çalışır. Tek fark içseldir: veriler yazarken şifrelenir ve okurken şifresi çözülür.
class AuthRepository(context: Context) {
private val prefs = createEncryptedPrefs(context)
fun saveCredentials(login: String, password: String) {
prefs.edit()
.putString("login", login)
.putString("password", password)
.apply()
}
fun getToken(): String? {
return prefs.getString("auth_token", null)
}
fun clearAll() {
prefs.edit().clear().apply()
}
}
Şifrelenmemiş SharedPreferences'dan EncryptedSharedPreferences'a mevcut verileri geçirmek için: eski dosyadaki tüm verileri okuyun, yeni bir EncryptedSharedPreferences oluşturun, tüm verileri yazın ve eski dosyayı silin. Google yerleşik bir geçiş aracı sağlamaz — geliştirici manuel olarak uygular.
SharedPreferences ve EncryptedSharedPreferences arasındaki seçim, depolanan verinin türüne bağlıdır. Arayüz ayarları (tema, dil, sıralama) için normal SharedPreferences yeterlidir. Gizli bilgiler (token'lar, şifreler, anahtarlar) için EncryptedSharedPreferences zorunludur.
EncryptedSharedPreferences, kriptografik işlemler nedeniyle normalden daha yavaştır. Tek bir dize değeri yazmak ~5-15 ms sürer (veri boyutuna ve AES donanım hızlandırmasına bağlı olarak). Okuma 2-5 ms sürer. Çoğu uygulama için bu fark edilmez, ancak toplu işlemler (geçiş, geri yükleme) için commit() yerine apply() kullanın.
Normal SharedPreferences hiçbir kriptografik koruma sağlamaz: XML dosyası, root erişimi olan herhangi bir işlem veya adb backup aracılığıyla okunabilir. EncryptedSharedPreferences verileri uygulama düzeyinde şifreler ve ana anahtar, isteğe bağlı donanım koruması (StrongBox) ile Android Keystore'da saklanır.
| Özellik | SharedPreferences | EncryptedSharedPreferences |
|---|---|---|
| Depolama | Düz XML | Şifrelenmiş ikili dosya |
| Şifreleme | Yok | AES-256 GCM + SIV |
| Anahtar Koruması | Yok | Android Keystore + StrongBox |
| Performans | 0.1-1 ms | 2-15 ms |
| Öneri | Arayüz Ayarları | Token'lar, anahtarlar, PII |
EncryptedSharedPreferences şunları depolamak için kullanın: OAuth yenileme token'ları, harici hizmetler için API anahtarları, kullanıcının e-posta adresi veya telefon numarası ve hassas uygulama ayarları (PIN, kimlik doğrulama bayrakları). EncryptedSharedPreferences, biyometrik verileri veya büyük belgeleri depolamak için uygun değildir — bunun yerine EncryptedFile veya SQLCipher ile Room kullanın.
Genel kural: veri sızıntısı kullanıcıya veya işletmeye zarar verecekse — EncryptedSharedPreferences kullanın. Veriler yalnızca kozmetikse (tema, dil, sıralama) — normal SharedPreferences. EncryptedSharedPreferences'ı baştan uygulamak mantıklıdır, yeniden düzenleme gerektirmez: mevcut bir projede değiştirilmesi, geçiş ve eski şifrelenmemiş verilerin işlenmesini gerektirir.
EncryptedSharedPreferences'ın verileri uygulama çalışırken değil, yalnızca diskte koruduğunu unutmayın. Bir saldırganın işlem belleğine erişimi varsa, şifresi çözülmüş veriler ele geçirilebilir. Ek koruma kullanın: karartma için ProGuard/DexGuard.
Sıkça Sorulan Sorular
Jetpack DataStore, Flow ve Kotlin eşyordamlarına dayanan, SharedPreferences'ın daha modern bir alternatifidir. DataStore varsayılan olarak verileri şifrelemez, ancak EncryptedSharedPreferences ile birleştirilebilir veya kriptografik protokollerle Proto DataStore aracılığıyla manuel şifrelemeyle kullanılabilir.
Önerilmez. EncryptedSharedPreferences küçük hacimler (100-200 KB'a kadar) için tasarlanmıştır. Daha büyük veriler için, aynı AndroidX Security kütüphanesinden SQLCipher ile Room veya EncryptedFile aracılığıyla dosya şifrelemesi kullanın.
Hayır, otomatik şema geçişi yoktur. Veri yapısı değiştirilirken geliştirici, eski KeyGen aracılığıyla eski verileri manuel olarak okumalı ve yenisi aracılığıyla yazmalıdır. Şema sürümünün ayrı bir parametrede saklanması önerilir.
AndroidX Security 1.0.0, API 19+'yı (Android KitKat) destekler. Sürüm 1.1.0-alpha06 da API 19+'yı destekler. StrongBox, API 28+ ve donanım desteği olan bir cihaz gerektirir (Google Pixel 3+, Samsung Galaxy S9+).
Evet, refresh token ana kullanım senaryolarından biridir. AES-256 GCM şifrelemesi, Keystore'da ana anahtar, biyometrik koruma — OAuth token'ları için yeterli bir seviye. Kısa ömürlü erişim token'ları için de uygundur, ancak bazı ekipler bunları bellekte saklamayı tercih eder.
Ö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