EncryptedSharedPreferences: bu nədir, API və necə istifadə etməli

Müəllif: IT Sectr Dərc olunub: 2026-03-14 Oxuma vaxtı: 10 dəq

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 — bütün saxlanılan məlumatların avtomatik şifrələnməsi ilə SharedPreferences ətrafında sarğı
  • Şifrələmə Android Keystore vasitəsilə dəyərlər üçün AES-256 GCM və açarlar üçün AES-256 SIV istifadə edir
  • Authenticated Encryption (AEAD) məlumatların yazıldıqdan sonra dəyişdirilmədiyinə zəmanət verir
  • Master Key Android Keystore-da saxlanılır və TEE olan cihazlarda aparat təminatı ilə qorunur
  • API tam SharedPreferences ilə uyğunluq — dəyişdirmə oxu və yazma kodunu dəyişmədən baş verir

EncryptedSharedPreferences nədir?

EncryptedSharedPreferencesandroidx.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.

Adi SharedPreferences problemi

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.

Tarix və versiyalar

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 necə işləyir?

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.

Şifrələmə sxemi: AES-256 GCM + SIV

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 və KeyStore

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.

kotlin
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
    )
}

Şifrələmə konfiqurasiyası

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.

Açar şifrələmə sxemləri

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.

Master açarın biometrik qorunması

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.

kotlin
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ə istifadə nümunəsi

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.

Asılılığın əlavə edilməsi

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.

Məlumatların oxunması və yazılması

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.

kotlin
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()
    }
}

Adi SharedPreferences-dən miqrasiya

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.

Adi SharedPreferences ilə müqayisə

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.

Performans

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.

Təhlükəsizlik

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ətSharedPreferencesEncryptedSharedPreferences
SaxlamaAçıq XMLŞifrələnmiş ikili fayl
ŞifrələməYoxAES-256 GCM + SIV
Açar qorunmasıYoxAndroid Keystore + StrongBox
Performans0.1-1 ms2-15 ms
TövsiyəUI parametrləriTokenlər, açarlar, PII

EncryptedSharedPreferences nə vaxt seçilməli

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

EncryptedSharedPreferences DataStore-dan nə ilə fərqlənir?

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.

EncryptedSharedPreferences böyük həcmli məlumatlar üçün istifadə edilə bilərmi?

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.

EncryptedSharedPreferences sxem yeniləməsində miqrasiyanı dəstəkləyirmi?

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.

Minimum tələb olunan API səviyyəsi nədir?

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+).

Refresh token-i EncryptedSharedPreferences-də saxlamaq təhlükəsizdirmi?

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ə

  • EncryptedSharedPreferences — AES-256 GCM (dəyərlər) və SIV (açarlar) vasitəsilə avtomatik şifrələmə ilə SharedPreferences sarğısı
  • Master Key MasterKey.Builder vasitəsilə yaradılır və Android Keystore-da biometriya və StrongBox seçimləri ilə saxlanılır
  • API tam uyğunluq: edit, putString, getString, apply, clear — hamısı adi SharedPreferences-də olduğu kimi
  • Performans: əməliyyat başına 2-15 ms, standart ssenarilərdə istifadəçi üçün nəzərə çarpmır
  • Təhlükəsizlik: autentifikasiya olunmuş şifrələmə (AEAD) həm oxunmanın, həm də məlumatların dəyişdirilməsinin qarşısını alır
  • Miqrasiya adi SharedPreferences-dən köhnə və yeni fayllar vasitəsilə əl ilə məlumat köçürülməsini tələb edir
  • Tokenlər, API açarları, şifrələr və digər məxfi parametrlər üçün EncryptedSharedPreferences istifadə edin

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.

Layihəni müzakirə et

Həm də oxuyun