Keystore (Android): bu nima, arxitekturasi va ishlash prinsiplari

Muallif: IT Sectr Nashr etilgan: 2026-03-14 O'qish vaqti: 10 daq

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 — kriptografik kalitlarni Android foydalanuvchi makonidan izolyatsiya qiluvchi KeyStore provayderi
  • Kalitlar TEE yoki Secure Element ichida yaratiladi va hech qachon himoyalangan muhitni ochiq shaklda tark etmaydi
  • Android 9+ KeyGenParameterSpec.Builder ni purpose, digest, padding, userAuthenticationRequired parametrlari bilan qo‘shadi
  • Biometrik kalit himoyasi har bir operatsiyadan oldin BiometricPrompt orqali foydalanuvchi tasdiqlashni talab qiladi
  • Keymaster HAL — TEE yoki Secure Element da kriptografik operatsiyalarni bajaruvchi apparat abstraktsiya darajasi

Android Keystore nima?

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 da KeyStore arxitekturasi

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.

Java KeyStore dan farqi

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.

Android Keystore qanday ishlaydi?

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.

Kalit yaratish jarayoni

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.

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

Imzolash va tekshirish

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.

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

KeyStore ombor turlari

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.

Dasturiy KeyStore (faqat dasturiy)

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.

Apparat KeyMaster (TEE/Secure Element)

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.

TurSaqlash joyiHimoya darajasiAPI dan boshlab
SoftwareFayl /data/misc/keystoreO‘rta (AES-256)API 1+
Keymaster 3TEE (TrustZone)YuqoriAPI 23+
Keymaster 4TEE + Secure I/OJuda yuqoriAPI 28+
StrongBoxApparat Secure ElementMaksimalAPI 28+, ixtiyoriy

KeyStore API bilan ishlash

Android Keystore Java Cryptography Architecture (JCA) bilan integratsiyalangan. Provayderga kirish uchun standart KeyStore.getInstance("AndroidKeyStore") ishlatiladi. API API 18 dan boshlab mavjud.

KeyStore yaratish va yuklash

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

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

Ombor turini tekshirish

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

Algoritmlar va xavfsizlik

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.

Qo‘llab-quvvatlanadigan algoritmlar

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.

Buzilishdan himoya

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

Android Keystore va Java dagi KeyStore o‘rtasidagi farq nima?

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.

Mavjud kalitni Android Keystore ga import qilish mumkinmi?

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.

Qurilma apparat KeyStore ni qo‘llab-quvvatlashini qanday tekshirish mumkin?

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 kalitlar bilan nima bo‘ladi?

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.

KeyStore disk raskadrovka orqali hujumlardan qanday himoya qiladi?

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

  • Android Keystore — TEE yoki Secure Element orqali kalitlarning apparat izolyatsiyasi bilan JCA kriptografik provayderi
  • Kalitlar TrustZone ichida yaratiladi va hech qachon himoyalangan muhitni ochiq shaklda tark etmaydi
  • KeyGenParameterSpec kalit parametrlarini belgilaydi: purpose, digest, padding, userAuthenticationRequired, keyValidity
  • Keymaster HAL uch darajani amalga oshiradi: dasturiy (software), TEE (Keymaster 3/4) va StrongBox (apparat Secure Element)
  • Biometrik kalit himoyasi setUserAuthenticationRequired va CryptoObject bilan BiometricPrompt orqali ta’minlanadi
  • Key Attestation (API 28+) serverda kalit apparat muhitida yaratilganligini tekshirish imkonini beradi
  • Android ilovalarida imzo, shifrlash va autentifikatsiya uchun xususiy kalitlarni saqlash uchun Android Keystore dan foydalaning

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.

Loyihani muhokama qilish

Shuningdek o'qing