EncryptedSharedPreferences — AndroidX Security kitabxanasının komponentidir, SharedPreferences API vasitəsilə saxlanılan məlumatların şəffaf şifrələnməsini təmin edir. Adi SharedPreferences-dən fərqli olaraq, məlumatların açıq XML faylında saxlandığı yerdə, EncryptedSharedPreferences avtomatik olaraq diskə yazmadan əvvəl açarları və dəyərləri şifrələyir. Android Developers-ə görə, kitabxana dəyərlər üçün AES-256 GCM və açarlar üçün AES-256 SIV (RFC 5297) istifadə edir, məlumatların məxfiliyini və bütövlüyünü təmin edir.
Əsaslar
EncryptedSharedPreferences — androidx.security.crypto paketindən olan sinifdir, AndroidX Security 1.0.0 (2019)-da təqdim edilmişdir. SharedPreferences interfeysini tətbiq edir, lakin bütün yazma əməliyyatları (putString, putInt, putBoolean və s.) məlumatları əvvəlcədən şifrələyir, oxuma əməliyyatları isə qaytarmazdan əvvəl onları deşifrə edir.
Standart SharedPreferences məlumatları tətbiq kataloqundakı XML faylına saxlayır (/data/data/package/shared_prefs/). Fayl şifrələnmir — cihaza root girişi olduqda və ya ehtiyat nüsxə təhlilində bütün məlumatlar adi XML kimi oxunur. Autentifikasiya tokenləri, API açarları, istifadəçinin şəxsi məlumatları təcavüzkar üçün əlçatan olur.
EncryptedSharedPreferences bu problemi kitabxana səviyyəsində həll edir: məlumatlar diskə yazılmazdan əvvəl şifrələnir və oxuyarkən deşifrə olunur. Tərtibatçı kriptoqrafik funksiyaları əl ilə çağırmalı deyil — API adi SharedPreferences ilə eyni qalır.
AndroidX Security kitabxanası v1.0.0 2019-cu ilin dekabrında buraxılmışdır. EncryptedSharedPreferences Cipher + SharedPreferences vasitəsilə əl ilə şifrələmə ilə köhnəlmiş yanaşmanı əvəz etmişdir. Hazırkı stabil versiya — 1.1.0-alpha06 (2024), API 19+ dəstəkləyir. Kitabxana Jetpack-in tərkib hissəsidir və əlavə icazələr tələb etmir.
Google Security Blog (2024)-ə görə, EncryptedSharedPreferences bulud vasitəsilə sinxronizasiya tələb etməyən məxfi tətbiq parametrlərinin saxlanması üçün tövsiyə olunan üsuldur. Daha mürəkkəb ssenarilər üçün SQLCipher vasitəsilə şifrələmə ilə Room təklif olunur.
EncryptedSharedPreferences iki səviyyəli şifrələmə sxemindən istifadə edir: master açar (Master Key) Android Keystore-da saxlanılır və məlumatların şifrələnməsi üçün törəmə açarlar istifadə olunur. Bu, Keystore qorunması və simmetrik şifrələmə performansının birləşməsidir.
Dəyərlər üçün AES-256 GCM (Galois/Counter Mode) istifadə olunur — autentifikasiya olunmuş şifrələmə rejimi (AEAD), məlumatların məxfiliyini və bütövlüyünü təmin edir. Açarlar (parametr adları) üçün AES-256 SIV (RFC 5297) tətbiq olunur — məzmununu açıqlamadan açar üzrə axtarış üçün zəruri olan deterministik şifrələmə.
Hər bir fayl EncryptedSharedPreferences şifrələnmiş açar-dəyər cütlərini ehtiva edir. Fayl strukturu: əvvəlcə metadata ilə başlıq (versiya, açar identifikatoru), sonra şifrələnmiş qeydlərin siyahısı. Fayl etibarlı XML deyil və mətn redaktorlarında oxunmur.
MasterKey sinfi Android Keystore-da saxlanılan 256-bit master açarın yaradılması və idarə edilməsinə cavabdehdir. MasterKey.Builder konfiqurasiya etməyə imkan verir: saxlama növü (Keystore və ya proqram təminatı), biometriya ilə qoruma, açarın ömür müddəti. Varsayılan olaraq, master açar Android Keystore-da AES/GCM/NoPadding alqoritmi ilə yaradılır.
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ş parametr qəbul edir: kontekst, fayl adı, master açar, açarlar üçün şifrələmə sxemi və dəyərlər üçün şifrələmə sxemi. Sxemlərin seçimi performans və qoruma səviyyəsinə təsir edir.
AES256_SIV — deterministik şifrələmə: eyni açarlar həmişə eyni şifrələnmiş mətn verir. Bu, açar üzrə axtarış üçün zəruridir (SharedPreferences.getX(key)). Çatışmazlıq: təcavüzkar təkrarlanan şifrə mətnlərindən hansı açarların istifadə edildiyini müəyyən edə bilər. AES256_SIV2 — əlavə randomizasiya ilə təkmilləşdirilmiş versiya.
Dəyərlər üçün AES256_GCM istifadə olunur. GCM hər dəyərə 12 baytlıq IV (başlanğıc vektoru) və 16 baytlıq autentifikasiya nişanı əlavə edir. Bu, məxfiliyi (heç kim dəyəri oxuya bilməz) və autentifikasiyanı (heç kim aşkarlanmadan dəyəri dəyişdirə bilməz) təmin edir.
MasterKey.Builder-da setUserAuthenticationRequired(true) metodu Keystore-dan master açarı əldə etməzdən əvvəl biometrik təsdiq tələb edir. Bu, əlavə səviyyə əlavə edir: tətbiq kilidi açılmış cihazda işləsə belə, təcavüzkar Face ID və ya Touch ID olmadan EncryptedSharedPreferences-i oxuya bilməz.
Vacib: setUserAuthenticationRequired ilə master açar, istifadəçi biometriyanı dəyişdikdə və ya sildikdə əlçatmaz olur. KeyPermanentlyInvalidatedException-u idarə etmək və məlumat miqrasiyası ilə yeni master açar yaratmaq lazımdır.
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) {
// Biometriya dəyişdi — açarı yenidən yaratmaq lazımdır
}
}
Kotlin-də Android tətbiqində EncryptedSharedPreferences inteqrasiyasının tam nümunəsini nəzərdən keçirək. androidx.security:security-crypto kitabxanası Gradle vasitəsilə əlavə olunur.
build.gradle (app) faylına əlavə edin: implementation “androidx.security:security-crypto:1.1.0-alpha06”. Kotlin layihələri üçün əlavə olaraq kotlin-stdlib tələb olunur. MasterKey-in başlanğıcı bir dəfə, adətən Application.onCreate və ya DI konteyneri vasitəsilə həyata keçirilir.
EncryptedSharedPreferences nümunəsi yaradıldıqdan sonra API adi SharedPreferences-dən fərqlənmir. edit() Editor qaytarır, bütün metodlar (putString, getString, putBoolean, getBoolean) eyni şəkildə işləyir. Fərq yalnız daxilidir: məlumatlar yazarkən şifrələnir və oxuyarkən deşifrə olunur.
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()
}
}
Mövcud məlumatları qorunmayan SharedPreferences-dən EncryptedSharedPreferences-ə miqrasiya etmək üçün: köhnə fayldan bütün məlumatları oxuyun, yeni EncryptedSharedPreferences yaradın, bütün məlumatları yazın, köhnə faylı silin. Google daxili miqrasiya aləti təmin etmir — tərtibatçı onu özü həyata keçirir.
SharedPreferences və EncryptedSharedPreferences arasında seçim saxlanılan məlumatların növündən asılıdır. İnterfeys parametrləri (mövzu, dil, sıralama) üçün adi SharedPreferences kifayətdir. Məxfi məlumatlar (tokenlər, şifrələr, açarlar) üçün EncryptedSharedPreferences məcburidir.
EncryptedSharedPreferences kriptoqrafik əməliyyatlara görə adi haldan daha yavaşdır. Bir sətir dəyərinin yazılması ~5-15 ms çəkir (məlumat ölçüsü və AES aparat sürətləndirilməsindən asılı olaraq). Oxuma — 2-5 ms. Əksər tətbiqlər üçün bu nəzərə çarpmır, lakin toplu əməliyyatlarda (miqrasiya, bərpa) commit() əvəzinə apply() istifadə etməyə dəyər.
Adi SharedPreferences heç bir kriptoqrafik qoruma təmin etmir: XML faylı root girişi olan istənilən proses və ya adb backup vasitəsilə oxuna bilər. EncryptedSharedPreferences məlumatları tətbiq səviyyəsində şifrələyir və master açar Android Keystore-da aparat qorunması (StrongBox) imkanı ilə saxlanılır.
| Xüsusiyyət | SharedPreferences | EncryptedSharedPreferences |
|---|---|---|
| Saxlama | Açıq XML | Şifrələnmiş ikili fayl |
| Şifrələmə | Yox | AES-256 GCM + SIV |
| Açar qorunması | Yox | Android Keystore + StrongBox |
| Performans | 0.1-1 ms | 2-15 ms |
| Tövsiyə | UI parametrləri | Tokenlər, açarlar, PII |
EncryptedSharedPreferences-dən istifadə edin: OAuth refresh token, xarici xidmətlər üçün API açarları, istifadəçinin email və ya telefon nömrəsi, məxfi tətbiq parametrləri (PIN, autentifikasiya bayraqları) saxlamaq üçün. Biometrik məlumatların və ya böyük sənədlərin saxlanması üçün EncryptedSharedPreferences uyğun deyil — EncryptedFile və ya SQLCipher ilə Room istifadə edin.
Ümumi qayda: məlumat sızması istifadəçiyə və ya biznesə zərər verərsə — EncryptedSharedPreferences istifadə edin. Məlumat yalnız kosmetikdirsə (mövzu, dil, sıralama) — adi SharedPreferences. EncryptedSharedPreferences-i dərhal tətbiq etmək məntiqlidir, refaktorinq etmədən: mövcud layihədə dəyişdirmə miqrasiya və köhnə şifrələnməmiş məlumatların işlənməsini tələb edir.
Unutmayın ki, EncryptedSharedPreferences məlumatları yalnız diskdə qoruyur — tətbiq işləyərkən yox. Təcavüzkar proses yaddaşına giriş əldə edərsə, deşifrə edilmiş məlumatlar ələ keçirilə bilər. Əlavə qoruma istifadə edin: kodun gizlədilməsi üçün ProGuard/DexGuard.
Tez-tez verilən suallar
Jetpack DataStore — SharedPreferences üçün daha müasir alternativdir, Flow və Kotlin korutinlərinə əsaslanır. DataStore varsayılan olaraq məlumatları şifrələmir, lakin EncryptedSharedPreferences ilə birləşdirilə bilər və ya Proto DataStore vasitəsilə əl ilə şifrələmə ilə istifadə edilə bilər.
Tövsiyə edilmir. EncryptedSharedPreferences kiçik həcmlər (100-200 KB-a qədər) üçün nəzərdə tutulmuşdur. Böyük məlumatlar üçün SQLCipher ilə Room və ya eyni AndroidX Security kitabxanasından EncryptedFile vasitəsilə fayl şifrələməsindən istifadə edin.
Xeyr, avtomatik sxem miqrasiyası yoxdur. Məlumat strukturunu dəyişdirərkən tərtibatçı köhnə məlumatları köhnə KeyGen vasitəsilə əl ilə oxumalı və yenisi ilə yazmalıdır. Sxem versiyasını ayrıca parametrdə saxlamaq tövsiyə olunur.
AndroidX Security 1.0.0 API 19+ (Android KitKat) dəstəkləyir. 1.1.0-alpha06 versiyası da API 19+ dəstəkləyir. StrongBox üçün API 28+ və aparat dəstəyi olan cihaz tələb olunur (Google Pixel 3+, Samsung Galaxy S9+).
Bəli, refresh token — əsas istifadə ssenarilərindən biridir. AES-256 GCM şifrələməsi, Keystore-da master açar, biometrik qoruma — OAuth tokenləri üçün kifayət səviyyədir. Qısa ömürlü access token üçün də uyğundur, baxmayaraq ki, bəzi komandalar onu yaddaşda saxlamağa üstünlük verir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun