EncryptedSharedPreferences — AndroidX Security kutubxonasining komponenti bo'lib, SharedPreferences API orqali saqlanadigan ma'lumotlarning shaffof shifrlanishini ta'minlaydi. Oddiy SharedPreferences-dan farqli o'laroq, ma'lumotlar ochiq XML faylida saqlanadigan joyda, EncryptedSharedPreferences diskka yozishdan oldin avtomatik ravishda kalitlar va qiymatlarni shifrlaydi. Android Developers ga ko'ra, kutubxona qiymatlar uchun AES-256 GCM va kalitlar uchun AES-256 SIV (RFC 5297) dan foydalanadi, ma'lumotlarning maxfiyligi va yaxlitligini ta'minlaydi.
Asosiy
EncryptedSharedPreferences — androidx.security.crypto paketidagi sinf bo'lib, AndroidX Security 1.0.0 (2019) da taqdim etilgan. SharedPreferences interfeysini amalga oshiradi, lekin barcha yozish operatsiyalari (putString, putInt, putBoolean va h.k.) ma'lumotlarni oldindan shifrlaydi, o'qish operatsiyalari esa qaytarishdan oldin ularni deshifrlaydi.
Standart SharedPreferences ma'lumotlarni ilova katalogidagi XML faylida saqlaydi (/data/data/package/shared_prefs/). Fayl shifrlanmagan — qurilmaga root kirishi yoki zaxira nusxani tahlil qilishda barcha ma'lumotlar oddiy XML sifatida o'qiladi. Autentifikatsiya tokenlari, API kalitlari, foydalanuvchining shaxsiy ma'lumotlari tajovuzkor uchun mavjud bo'ladi.
EncryptedSharedPreferences bu muammoni kutubxona darajasida hal qiladi: ma'lumotlar diskka yozilishidan oldin shifrlanadi va o'qiyotganda deshifrlanadi. Dasturchi kriptografik funktsiyalarni qo'lda chaqirishi shart emas — API oddiy SharedPreferences bilan bir xil qoladi.
AndroidX Security kutubxonasi v1.0.0 2019 yil dekabrda chiqarilgan. EncryptedSharedPreferences Cipher + SharedPreferences orqali qo'lda shifrlash bilan eskirgan yondashuvni almashtirdi. Hozirgi barqaror versiya — 1.1.0-alpha06 (2024), API 19+ ni qo'llab-quvvatlaydi. Kutubxona Jetpack tarkibiga kiradi va qo'shimcha ruxsatlarni talab qilmaydi.
Google Security Blog (2024) ma'lumotlariga ko'ra, EncryptedSharedPreferences bulut orqali sinxronizatsiyani talab qilmaydigan maxfiy ilova sozlamalarini saqlash uchun tavsiya etilgan usuldir. Murakkabroq stsenariylar uchun SQLCipher orqali shifrlash bilan Room taklif qilinadi.
EncryptedSharedPreferences ikki darajali shifrlash sxemasidan foydalanadi: asosiy kalit (Master Key) Android Keystore da saqlanadi va ma'lumotlarni shifrlash uchun hosila kalitlar ishlatiladi. Bu Keystore himoyasi va simmetrik shifrlash samaradorligining kombinatsiyasidir.
Qiymatlar uchun AES-256 GCM (Galois/Counter Mode) ishlatiladi — autentifikatsiyalangan shifrlash rejimi (AEAD), ma'lumotlarning maxfiyligi va yaxlitligini ta'minlaydi. Kalitlar (parametr nomlari) uchun AES-256 SIV (RFC 5297) qo'llaniladi — mazmunini ochmasdan kalit bo'yicha qidirish uchun zarur bo'lgan deterministik shifrlash.
Har bir fayl EncryptedSharedPreferences shifrlangan kalit-qiymat juftliklarini o'z ichiga oladi. Fayl tuzilishi: avval metama'lumotlar bilan sarlavha (versiya, kalit identifikatori), keyin shifrlangan yozuvlar ro'yxati. Fayl haqiqiy XML emas va matn muharrirlarida o'qilmaydi.
MasterKey sinfi Android Keystore da saqlanadigan 256-bitli asosiy kalitni yaratish va boshqarish uchun javobgardir. MasterKey.Builder sozlash imkonini beradi: saqlash turi (Keystore yoki dasturiy), biometriya bilan himoya, kalitning amal qilish muddati. Odatiy bo'lib, asosiy kalit Android Keystore da AES/GCM/NoPadding algoritmi bilan yaratiladi.
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 besh parametrni qabul qiladi: kontekst, fayl nomi, asosiy kalit, kalitlar uchun shifrlash sxemasi va qiymatlar uchun shifrlash sxemasi. Sxemalarni tanlash samaradorlik va himoya darajasiga ta'sir qiladi.
AES256_SIV — deterministik shifrlash: bir xil kalitlar har doim bir xil shifrlangan matnni beradi. Bu kalit bo'yicha qidirish uchun zarur (SharedPreferences.getX(key)). Kamchilik: tajovuzkor takrorlanuvchi shifr matnlaridan qaysi kalitlar ishlatilayotganini aniqlashi mumkin. AES256_SIV2 — qo'shimcha randomizatsiya bilan takomillashtirilgan versiya.
Qiymatlar uchun AES256_GCM ishlatiladi. GCM har bir qiymatga 12 baytli IV (boshlang'ich vektor) va 16 baytli autentifikatsiya belgisini qo'shadi. Bu maxfiylik (hech kim qiymatni o'qiy olmaydi) va autentifikatsiyani (hech kim aniqlanmasdan qiymatni o'zgartira olmaydi) ta'minlaydi.
MasterKey.Builder da setUserAuthenticationRequired(true) metodi Keystore dan asosiy kalitni olishdan oldin biometrik tasdiqlashni talab qiladi. Bu qo'shimcha daraja qo'shadi: ilova qulfi ochilgan qurilmada ishlasa ham, tajovuzkor Face ID yoki Touch ID siz EncryptedSharedPreferences ni o'qiy olmaydi.
Muhim: setUserAuthenticationRequired bilan asosiy kalit foydalanuvchi biometriyani o'zgartirgan yoki o'chirgan holda mavjud bo'lmaydi. KeyPermanentlyInvalidatedException ni boshqarish va ma'lumotlar migratsiyasi bilan yangi asosiy kalit yaratish kerak.
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 o'zgardi — kalitni qayta yaratish kerak
}
}
Kotlin da Android ilovasida EncryptedSharedPreferences integratsiyasining to'liq namunasini ko'rib chiqaylik. androidx.security:security-crypto kutubxonasi Gradle orqali qo'shiladi.
build.gradle (app) fayliga qo'shing: implementation “androidx.security:security-crypto:1.1.0-alpha06”. Kotlin loyihalari uchun qo'shimcha ravishda kotlin-stdlib talab qilinadi. MasterKey ni boshlash bir marta, odatda Application.onCreate yoki DI konteyneri orqali amalga oshiriladi.
EncryptedSharedPreferences namunasi yaratilgandan keyin API oddiy SharedPreferences dan farq qilmaydi. edit() Editor ni qaytaradi, barcha metodlar (putString, getString, putBoolean, getBoolean) o'xshash ishlaydi. Farq faqat ichki: ma'lumotlar yozishda shifrlanadi va o'qishda deshifrlanadi.
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()
}
}
Mavjud ma'lumotlarni himoyalanmagan SharedPreferences dan EncryptedSharedPreferences ga migratsiya qilish uchun: eski fayldan barcha ma'lumotlarni o'qing, yangi EncryptedSharedPreferences yarating, barcha ma'lumotlarni yozing, eski faylni o'chiring. Google o'rnatilgan migratorni ta'minlamaydi — dasturchi uni o'zi amalga oshiradi.
SharedPreferences va EncryptedSharedPreferences o'rtasidagi tanlov saqlanadigan ma'lumotlarning turiga bog'liq. Interfeys sozlamalari (mavzu, til, saralash) uchun oddiy SharedPreferences yetarli. Maxfiy ma'lumotlar (tokenlar, parollar, kalitlar) uchun EncryptedSharedPreferences majburiydir.
EncryptedSharedPreferences kriptografik operatsiyalar tufayli oddiydan sekinroq. Bitta satr qiymatini yozish ~5-15 ms davom etadi (ma'lumotlar hajmi va AES apparat tezlashuviga bog'liq). O'qish — 2-5 ms. Ko'pchilik ilovalar uchun bu sezilmaydi, lekin paket operatsiyalarida (migratsiya, tiklash) commit() o'rniga apply() dan foydalanish kerak.
Oddiy SharedPreferences hech qanday kriptografik himoyani ta'minlamaydi: XML fayli root kirishiga ega har qanday jarayon yoki adb backup orqali o'qilishi mumkin. EncryptedSharedPreferences ma'lumotlarni ilova darajasida shifrlaydi va asosiy kalit Android Keystore da apparat himoyasi (StrongBox) imkoniyati bilan saqlanadi.
| Xususiyat | SharedPreferences | EncryptedSharedPreferences |
|---|---|---|
| Saqlash | Ochiq XML | Shifrlangan ikkilik fayl |
| Shifrlash | Yo'q | AES-256 GCM + SIV |
| Kalit himoyasi | Yo'q | Android Keystore + StrongBox |
| Samaradorlik | 0.1-1 ms | 2-15 ms |
| Tavsiya | UI sozlamalari | Tokenlar, kalitlar, PII |
EncryptedSharedPreferences dan saqlash uchun foydalaning: OAuth refresh token, tashqi xizmatlar uchun API kalitlari, foydalanuvchining email yoki telefon raqami, maxfiy ilova sozlamalari (PIN, autentifikatsiya bayroqlari). Biometrik ma'lumotlar yoki katta hujjatlarni saqlash uchun EncryptedSharedPreferences mos emas — EncryptedFile yoki SQLCipher bilan Room dan foydalaning.
Umumiy qoida: agar ma'lumotlar sizib chiqishi foydalanuvchiga yoki biznesga zarar keltirsa — EncryptedSharedPreferences dan foydalaning. Agar ma'lumotlar faqat kosmetik bo'lsa (mavzu, til, saralash) — oddiy SharedPreferences. EncryptedSharedPreferences ni darhol joriy qilish mantiqan to'g'ri, refaktoring qilmasdan: mavjud loyihada almashtirish migratsiya va eski shifrlanmagan ma'lumotlarni qayta ishlashni talab qiladi.
Unutmangki, EncryptedSharedPreferences ma'lumotlarni faqat diskda himoya qiladi — ilova ishlayotgan vaqtda emas. Agar tajovuzkor jarayon xotirasiga kirish imkoniga ega bo'lsa, deshifrlangan ma'lumotlar ushlanishi mumkin. Qo'shimcha himoyadan foydalaning: kodni xiralashtirish uchun ProGuard/DexGuard.
Ko'p so'raladigan savollar
Jetpack DataStore — SharedPreferences uchun zamonaviyroq alternativa bo'lib, Flow va Kotlin korutinlariga asoslangan. DataStore odatiy bo'lib ma'lumotlarni shifrlamaydi, lekin EncryptedSharedPreferences bilan birlashtirilishi yoki Proto DataStore orqali qo'lda shifrlash bilan ishlatilishi mumkin.
Tavsiya etilmaydi. EncryptedSharedPreferences kichik hajmlar (100-200 KB gacha) uchun mo'ljallangan. Katta ma'lumotlar uchun SQLCipher bilan Room yoki xuddi shu AndroidX Security kutubxonasidan EncryptedFile orqali fayl shifrlashidan foydalaning.
Yo'q, avtomatik sxema migratsiyasi mavjud emas. Ma'lumotlar strukturasini o'zgartirganda dasturchi eski ma'lumotlarni eski KeyGen orqali qo'lda o'qishi va yangisi orqali yozishi kerak. Sxema versiyasini alohida parametrda saqlash tavsiya etiladi.
AndroidX Security 1.0.0 API 19+ (Android KitKat) ni qo'llab-quvvatlaydi. 1.1.0-alpha06 versiyasi ham API 19+ ni qo'llab-quvvatlaydi. StrongBox uchun API 28+ va apparat qo'llab-quvvatlashiga ega qurilma talab qilinadi (Google Pixel 3+, Samsung Galaxy S9+).
Ha, refresh token — asosiy foydalanish stsenariylaridan biridir. AES-256 GCM shifrlashi, Keystore da asosiy kalit, biometrik himoya — OAuth tokenlari uchun yetarli daraja. Qisqa muddatli access token uchun ham mos keladi, garchi ba'zi jamoalar uni xotirada saqlashni afzal ko'rsa.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.