Android Keystore — bu kriptografik kalitlarni apparat izolyatsiyasida xavfsiz saqlash uchun Android tizim mexanizmidir. Tizim ARM TrustZone li qurilmalarda Trusted Execution Environment (TEE) yoki kalitlarni chip darajasida himoya qilish uchun maxsus Secure Element dan foydalanadi. Android Open Source Project ga ko‘ra, Keystore RSA, EC, AES va HMAC algoritmlarini kalitlarni to‘g‘ridan-to‘g‘ri himoyalangan muhitda yaratish bilan qo‘llab-quvvatlaydi.
Asosiy
Android Keystore — bu Android da API 1 (Android 1.0) dan boshlab tatbiq qilingan kriptografik provayder (provider), ammo to‘liq apparat qo‘llab-quvvatlash Android 4.3 (API 18) dan paydo bo‘ldi. Keystore xususiy kalitlarni operatsion tizim buzilgan taqdirda ham, tajovuzkor kalitlarni ochiq shaklda chiqara olmaydigan tarzda xavfsiz saqlash muammosini hal qiladi.
Android Keystore arxitekturasi uch darajadan iborat: amaliy API (java.security.KeyStore), tizim xizmati (keystore daemon) va apparat darajasi (Keymaster HAL). Ilova standart Java Cryptography Architecture (JCA) API orqali murojaat qiladi, tizim xizmati esa so‘rovlarni TEE da ishlaydigan Keymaster ga yo‘naltiradi.
Kalitlar bilan barcha kriptografik operatsiyalar (imzo, shifrni ochish) TEE yoki Secure Element ichida bajariladi. Kalitlar hech qachon himoyalangan muhitni tark etmaydi — ilova kalitga murojaat qilish uchun faqat identifikator (alias) oladi. Bu kalitlar potensial jarayon xotirasida mavjud bo‘lgan dasturiy KeyStore lardan tubdan farqdir.
Standart JKS (Java KeyStore) yoki BKS (Bouncy Castle) kalitlarni parol bilan himoyalangan fayllarda saqlaydi. Android Keystore kalitlarni apparat izolyatsiyasida saqlaydi, ular hatto root foydalanuvchidan ham himoyalangan. JKS fayl tizimiga to‘g‘ridan-to‘g‘ri kirishda zaif, Android Keystore — yo‘q.
Yana bir farq: Android Keystore da kalitlar yaratilish vaqtida belgilangan qat‘iy foydalanish parametrlariga (purpose — faqat sign/verify/encrypt/decrypt) ega. Ularni keyinchalik o‘zgartirib bo‘lmaydi, bu kalitni noto‘g‘ri ishlatishning oldini oladi.
Yangi kalit yaratishda ilova kelajakdagi kalitning barcha parametrlarini o‘z ichiga olgan KeyPairGenerator yoki KeyGenerator ni KeyGenParameterSpec bilan chaqiradi. Tizim so‘rovni Keymaster HAL ga uzatadi, u kalitni TEE ichida yaratadi va identifikator qaytaradi.
KeyGenParameterSpec.Builder metodi majburiy parametrlarni qabul qiladi: Keystore dagi kalit nomi, maqsad (PURPOSE_SIGN, PURPOSE_ENCRYPT), algoritm (RSA, EC, AES). Qo‘shimcha: digest (SHA-256), padding (PKCS7), userAuthenticationRequired (biometriya), keyValidityStart/End (vaqt cheklovlari).
Parametrlar o‘rnatilgandan so‘ng, KeyPairGenerator.generateKeyPair() KeyPair qaytaradi, bu yerda PrivateKey operatsiyalarni Keymaster ga topshiruvchi ob’ektdir. Ochiq kalit chiqarilishi mumkin, xususiy kalit — yo‘q. U faqat TEE ichida mavjud.
import java.security.KeyPairGenerator
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
fun generateKey(alias: String) {
val spec = KeyGenParameterSpec.Builder(alias,
KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
).setDigests(KeyProperties.DIGEST_SHA256)
.setSignaturePaddings(KeyProperties.SIGN_PADDING_RSA_PKCS1)
.setUserAuthenticationRequired(true)
.build()
val kpGen = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA,
"AndroidKeyStore"
)
kpGen.initialize(spec)
kpGen.generateKeyPair()
}
ECDSA yoki RSA-PSS uchun Signature standart API orqali yaratiladi: Signature.getInstance(algorithm).initSign(privateKey). Imzolash operatsiyasi TEE da bajariladi: ilova ma’lumotlarni uzatadi, Keymaster ularni apparat vositasida imzolaydi va imzoni qaytaradi. Kalit va ma’lumotlar umumiy xotirada aralashmaydi.
Biometrik himoya uchun imzolashdan oldin foydalanuvchini BiometricPrompt orqali autentifikatsiya qilish kerak. Muvaffaqiyatli autentifikatsiyasiz Keymaster operatsiyani bajarmaydi, CryptoAuthenticationException qaytaradi.
import java.security.KeyStore
import java.security.Signature
import androidx.biometric.BiometricPrompt
fun signWithBiometric(alias: String) {
val ks = KeyStore.getInstance("AndroidKeyStore")
ks.load(null)
val entry = ks.getEntry(alias, null) as KeyStore.PrivateKeyEntry
val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(entry.privateKey)
// BiometricPrompt CryptoObject(signature) bilan FaceID/PIN so‘raydi
}
Android kalitlarni saqlashning ikki rejimini qo‘llab-quvvatlaydi: dasturiy (TEE siz qurilmalarda) va apparat (TEE yoki Secure Element li qurilmalarda). Rejim SoC imkoniyatlari va Android versiyasiga bog‘liq.
Trusted Execution Environment siz qurilmalarda (Android 4.3 dan oldin yoki byudjet SoC) kalitlar bloklash ekrani parolidan olingan master kalit yordamida shifrlangan shaklda saqlanadi. Bu rejim kamroq xavfsiz — kriptografik operatsiyalar paytida kalitlar jarayon xotirasida mavjud.
Himoya darajasi AES-256-GCM yordamida KeyStore faylining shifrlanishiga asoslanadi. Shifrlash kaliti Scrypt (ko‘p sonli iteratsiyalar bilan PBKDF2) orqali foydalanuvchi paroli yoki PIN asosida yaratiladi.
Zamonaviy qurilmalarda TEE (ARM TrustZone) da Keymaster 4.x ishlatiladi. Kalitlar faqat TrustZone ichida yaratiladi, saqlanadi va ishlatiladi. Hatto Linux yadrosining xususiy kalitlarga kirishi yo‘q — faqat Keymaster HAL operatsiyalarni bajarishi mumkin.
Secure Element (masalan, Samsung Knox dagi eSE yoki Google Pixel 3+ dagi StrongBox) — o‘z protsessori va xotirasiga ega alohida chip. Common Criteria EAL 4+ sertifikatiga ega va jismoniy ochishdan himoya qilishni o‘z ichiga olgan maksimal himoya darajasini ta’minlaydi.
| Tur | Saqlash joyi | Himoya darajasi | API dan boshlab |
|---|---|---|---|
| Software | Fayl /data/misc/keystore | O‘rta (AES-256) | API 1+ |
| Keymaster 3 | TEE (TrustZone) | Yuqori | API 23+ |
| Keymaster 4 | TEE + Secure I/O | Juda yuqori | API 28+ |
| StrongBox | Apparat Secure Element | Maksimal | API 28+, ixtiyoriy |
Android Keystore Java Cryptography Architecture (JCA) bilan integratsiyalangan. Provayderga kirish uchun standart KeyStore.getInstance("AndroidKeyStore") ishlatiladi. API API 18 dan boshlab mavjud.
KeyStore.load(null) metodi joriy ilovaning KeyStore konteynerini yuklaydi. Parol talab qilinmaydi — Android kirishni farqlash uchun ilova konteksti va uning UID dan foydalanadi. Har bir ilova umumiy UID ishlatilmasa, faqat o‘z yozuvlarini ko‘radi.
setEntry va getEntry metodlari KeyStore.PrivateKeyEntry, SecretKeyEntry yoki TrustedCertificateEntry bilan ishlaydi. ProtectionParameter parametri Android Keystore uchun har doim null (himoya tizim darajasida amalga oshiriladi).
import java.security.KeyStore
import java.security.cert.Certificate
import android.security.keystore.KeyProtection
fun storeSecretKey(alias: String, key: SecretKey) {
val ks = KeyStore.getInstance("AndroidKeyStore")
ks.load(null)
val prot = KeyProtection.Builder(
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
).setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setUserAuthenticationRequired(true)
.build()
ks.setEntry(alias, KeyStore.SecretKeyEntry(key), prot)
}
KeyCharacteristics yordamida kalit qaysi muhitda saqlanganini aniqlash mumkin: dasturiy KeyStore, TEE yoki StrongBox. getKeyCharacteristics() metodi bayroqlar to‘plamini qaytaradi: FLAG_HARDWARE (keymaster), FLAG_SECURE_ELEMENT (StrongBox), FLAG_TRUSTED_USER_PRESENCE_REQUIRED (biometriya).
Android Keystore uch kategoriyaga bo‘lingan keng kriptografik algoritmlar to‘plamini qo‘llab-quvvatlaydi: assimetrik, simmetrik va MAC. Muayyan algoritmlarni qo‘llab-quvvatlash Keymaster HAL versiyasiga bog‘liq.
RSA (1024–4096 bit) — imzo (PKCS1, PSS) va shifrlash (OAEP, PKCS1) uchun. EC (P-224, P-256, P-384, P-521) — ECDSA imzo va ECDH kelishuvi uchun. AES (128, 256 bit) — CBC, CTR, GCM rejimlarida simmetrik shifrlash uchun. HMAC (SHA1, SHA256, SHA512) — xabarlarni autentifikatsiya qilish uchun.
Har bir kalit uchun mumkin bo‘lgan operatsiyalarni cheklovchi setPurposes belgilanadi. PURPOSE_SIGN li RSA kaliti, hatto tajovuzkorning API ga kirishi bo‘lsa ham, shifrlash uchun ishlatilmaydi. Bu apparat darajasida kalit ishlatilishini majburlashdir.
Keymaster muvaffaqiyatsiz biometrik autentifikatsiya urinishlari hisoblagichini o‘z ichiga oladi. Belgilangan muvaffaqiyatsiz urinishlar sonidan so‘ng (setInvalidatedByBiometricEnrollment orqali sozlanadi) kalit erishib bo‘lmas holga keladi va o‘chirish/qayta yaratishni talab qiladi. Barcha biometrik shablonlar o‘chirilganda, userAuthenticationRequired=true bo‘lgan barcha kalitlar avtomatik ravishda bekor qilinadi.
Shuningdek, Key Attestation (Android 8.1+) qo‘llab-quvvatlanadi: ilova so‘roviga ko‘ra, Keymaster kalit xarakteristikalari (apparat/dasturiy, algoritm, purges) haqida ma’lumotga ega sertifikatni imzolaydi. Server kalit ishonchli muhitda yaratilganligini tasdiqlash uchun ushbu sertifikatni tekshirishi mumkin.
Tez-tez beriladigan savollar
Java KeyStore kalitlarni parol bilan himoyalangan faylda (JKS, BKS) saqlaydi. Android Keystore TEE yoki Secure Element apparat izolyatsiyasidan foydalanadi. Java KeyStore root kirishida zaif, Android Keystore — yo‘q, chunki xususiy kalitlar hech qachon himoyalangan muhitni tark etmaydi.
Ha, KeyStore.setEntry orqali KeyProtection bilan. Biroq import qilingan kalit apparat himoyasiga ega bo‘lmaydi — u master kalit bilan shifrlangan dasturiy Keystore da saqlanadi. Maksimal xavfsizlik uchun har doim kalitlarni Keystore ichida yarating.
KeyChain.isBoundKeyAlgorithm dan foydalaning yoki kalit yaratilgandan so‘ng KeyCharacteristics ni tekshiring. Xarakteristikalarda FLAG_HARDWARE mavjudligi kalit TEE da yaratilganligini anglatadi. Shuningdek android.security.keystore.isHardwareBacked() ni tekshirishingiz mumkin.
Ilova o‘chirilganda Android uning barcha kalitlarini Keystore dan o‘chiradi. Ma’lumotlar qaytarib bo‘lmaydigan darajada yo‘qoladi. Qayta o‘rnatishda ilova yangi kalitlarni yaratishi kerak. TEE orqali kalitlarning zaxira nusxasini yaratish arxitektura sabablariga ko‘ra mumkin emas.
Bloklangan qurilmada Keymaster hech qanday operatsiyani bajarmaydi. userAuthenticationRequired=true bo‘lgan kalitlar har safar biometrik tasdiqlashni talab qiladi. Hatto root kirishi bilan ham tajovuzkor Keymaster ga to‘g‘ridan-to‘g‘ri qo‘ng‘iroq qila olmaydi — faqat Android Keystore service orqali.
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.