Android’da Keystore — bu nima, arxitektura va kriptografiya

Muallif: IT Sectr Nashr etilgan: 2026-04-04 O'qish vaqti: 9 daq

Android Keystore — izolyatsiya qilingan bajarish muhitida (TEE) shifrlash kalitlarini yaratadigan va saqlaydigan kriptografik provayder bo'lib, hatto operatsion tizim uchun ham mavjud emas. AOSP Security Documentation (2025) ma'lumotlariga ko'ra, Keystore Google Play top-100'dagi Android ilovalarining 80% dan ko'prog'ida tokenlarni himoya qilish va ma'lumotlarni shifrlash uchun ishlatiladi. Android Keystore ni tushunish Android'da kalitlarni xavfsiz saqlash uchun juda muhimdir.

Asosiy

  • Android Keystore — kriptografik kalitlarni apparat-izolyatsiya qilingan muhitda (TEE) yaratish va saqlash uchun tizim provayderi.
  • StrongBox Keymaster — o'z CPU va TRNG ga ega maxsus xavfsizlik chipi, Common Criteria EAL 4+ sertifikatlangan.
  • KeyGenParameterSpec — algoritm, kalit hajmi, biometrik bog'lanish va amal qilish muddatini sozlash uchun konfigurator.
  • TEE (Trusted Execution Environment) — foydalanuvchi makonidan kirishsiz kriptografik operatsiyalar bajariladigan protsessorning izolyatsiya qilingan hududi.
  • Keystore kalitlarini chiqarib bo'lmaydi — shaxsiy kalit hech qachon TEE yoki StrongBoxni tark etmaydi, hatto ilova ishlab chiqaruvchisi ham uni o'qiy olmaydi.

Android'da Keystore nima?

Android Keystore — himoyalangan muhitda kriptografik kalitlarni yaratish, saqlash va ishlatish uchun API ta'minlaydigan Android platformasining tizim komponentidir. Dasturiy kriptografik kutubxonalardan (Bouncy Castle, Conscrypt) farqli o'laroq, Keystore shaxsiy kalitlarning hech qachon izolyatsiya qilingan bajarish hududini tark etmasligini kafolatlaydi.

Keystore Android 4.3 (API 18) da RSA qo'llab-quvvatlashi bilan dasturiy provayder sifatida paydo bo'ldi. Android 6.0 (API 23) dan boshlab, Keystore Keymaster Hardware Abstraction Layer (HAL) orqali apparat qo'llab-quvvatlashini oldi va kriptografik operatsiyalarni mos qurilmalarda Trusted Execution Environment (TEE) ga topshiradi. Android Compatibility Definition Document (2025) ga ko'ra, Android 9+ bo'lgan barcha qurilmalar TEE yoki StrongBox orqali apparat Keystore ni qo'llab-quvvatlashi shart.

Keystore'dagi kalitlar alias (taxallus) bilan aniqlanadi — kalitni yaratish yoki yuklashda uzatiladigan satr. Keystore kalitning xom ashyosini olishga ruxsat bermaydi: getEncoded() metodlari Keystore'da yaratilgan kalitlar uchun null qaytaradi. Bu dasturiy kalitlardan tub farqdir — hujumchi qurilma ustidan to'liq nazoratga ega bo'lsa ham shaxsiy kalitni chiqarib ololmaydi.

Keystore Android-ning boshqa xavfsizlik mexanizmlari bilan integratsiyalashgan: biometrik autentifikatsiya (BiometricPrompt), fayl darajasidagi shifrlash (File-Based Encryption) va SafetyNet / Play Integrity tekshirish funksiyalari. Kalitlar ma'lum shartlarda avtomatik o'chirish uchun sozlanishi mumkin: kod-parolni o'chirishda, yangi barmoq izini qo'shishda yoki muddat tugashida.

Android Keystore arxitekturasi

Android Keystore arxitekturasi apparat himoya darajasi bilan farqlanuvchi uchta amalga oshirish darajasini o'z ichiga oladi. Daraja qurilmaning apparat imkoniyatlariga bog'liq.

Hardware-backed Keystore (TEE)

TEE (Trusted Execution Environment) — bir xil protsessorda asosiy OT bilan parallel ishlaydigan izolyatsiya qilingan hudud. TEE ARM TrustZone texnologiyasidan foydalanadi, u fizik protsessor yadrosini ikkita virtual qismga ajratadi: Normal World (Android) va Secure World (TEE). Secure World'dagi kod Normal World'dan mavjud bo'lmagan xotira va periferik qurilmalarga kirish huquqiga ega.

Ilova Keystore orqali kriptografik operatsiyani chaqirganda, so'rov Keymaster HAL orqali TEE ga uzatiladi va operatsiya apparat tarafidan bajariladi. Natija ilovaga qaytariladi, ammo shaxsiy kalit TEE himoyalangan xotirasida qoladi. TEE GlobalPlatform TEE Protection Profile bo'yicha sertifikatlangan va TrustZone-ni qo'llab-quvvatlovchi protsessorli qurilmalarda Android 9+ uchun majburiy talabdir.

TEE AES/GCM (128, 256 bit), RSA (2048, 4096 bit), EC (P-256, P-384, P-521) va HMAC-SHA256 algoritmlarini qo'llab-quvvatlaydi. TEE unumdorligi dasturiy kriptografiyadan past (20–40% ga), ammo odatiy operatsiyalar (JWT imzosi, sessiya kalitining shifrini ochish) uchun kechikish 10–50 ms dan oshmaydi.

StrongBox Keymaster

StrongBox — asosiy protsessordan fizik jihatdan ajratilgan maxsus xavfsizlik chipi. TEE dan farqli o'laroq (Android bilan protsessor vaqtini baham ko'radi), StrongBox o'z CPU, operativ xotira, True Random Number Generator (TRNG) va himoyalangan saqlash (One-Time Programmable memory) ga ega. StrongBox Common Criteria EAL 4+ va Secure IC Protection Profile bo'yicha sertifikatlangan.

StrongBox Android 9+ bo'lgan qurilmalarda tegishli chip mavjud bo'lganda mavjud (masalan, Google Pixel'da Titan M, Samsung Galaxy'da Knox). Ishlab chiqaruvchi StrongBox-ni KeyGenParameterSpec'dagi setIsStrongBoxBacked(true) flagi orqali yoqadi. Apparat qo'llab-quvvatlashi bo'lmasa, flag e'tiborga olinmaydi va Keystore TEE ga o'tadi.

StrongBox cheklovlari: cheklangan algoritmlar to'plami (AES-256, EC P-256, HMAC-SHA256), operatsiyalar navbati — bir vaqtning o'zida ko'pi bilan bitta, operatsiyalar soni — chip resurslari bilan cheklangan. StrongBox yuqori yuklangan stsenariylar uchun mo'ljallanmagan — tez-tez operatsiyalar uchun TEE dan, faqat muhim kalitlar uchun (master shifrlash kalitlari, imzo kalitlari) StrongBox dan foydalaning.

Software-based Keystore

Software-based Keystore — TEE yoki StrongBox apparat qo'llab-quvvatlashisiz qurilmalarda ishlatiladigan dasturiy amalga oshirish. Kalitlar fayl tizimida shifrlangan holda saqlanadi, ammo shaxsiy kalit vaqtincha RAM da shifrdan chiqarilishi mumkin. Dasturiy Keystore kamroq xavfsiz — root kirishiga ega hujumchi xotiradagi kalitni ushlashi mumkin.

Android 12 (API 31) dan boshlab, Google barcha yangi qurilmalar uchun apparat Keystore qo'llab-quvvatlashini talab qiladi. Android 9–11 bo'lgan qurilmalar byudjet modellarida dasturiy Keystore ga ega bo'lishi mumkin. Ishlab chiqaruvchi KeyStore.getKeyCharacteristics() orqali himoya darajasini tekshirishi mumkin — SECURITY_LEVEL_TRUSTED_ENVIRONMENT yoki SECURITY_LEVEL_STRONGBOX atributi apparat himoyasini tasdiqlaydi.

Qo'llab-quvvatlanadigan algoritmlar va funksiyalar

Android Keystore kalit turiga qarab kategoriyalarga bo'lingan keng ko'lamli kriptografik algoritmlarni qo'llab-quvvatlaydi. Algoritm tanlovi unumdorlikka, muvofiqlikka va xavfsizlik darajasiga ta'sir qiladi.

AES (Advanced Encryption Standard) — qurilmadagi ma'lumotlarni himoya qilish uchun simmetrik shifrlash. Tavsiya etilgan rejim: AES/GCM/NoPadding (256 bit). GCM autentifikatsiyalangan shifrlash (AEAD) — shifrlangan ma'lumotlarning yaxlitligini tekshirishni ta'minlaydi. IV (Initialization Vector) hajmi: GCM uchun 12 bayt. AES/ECB dan foydalanmang ‒ tegishli himoyani ta'minlamaydi.

RSA (Rivest–Shamir–Adleman) — sessiya kalitlarini himoya qilish va raqamli imzo uchun asimmetrik shifrlash. Tavsiya etilgan hajm: 2048 yoki 4096 bit. Rejimlar: RSA/ECB/PKCS1Padding (shifrlash) va RSA/ECB/PKCS1Sign (imzo). RSA 1024 eskirgan deb hisoblanadi va yangi ilovalar uchun tavsiya etilmaydi (NIST SP 800-131A Rev. 2).

EC (Elliptic Curve) — imzo va kalit almashinuvi uchun elliptik egri chiziqlar bo'yicha asimmetrik kriptografiya. Qo'llab-quvvatlanadigan egri chiziqlar: secp256r1 (P-256, majburiy), secp384r1 (P-384) va secp521r1 (P-521). EC sezilarli darajada kichikroq kalit hajmi bilan RSA bilan solishtirish mumkin bo'lgan xavfsizlikni ta'minlaydi. P-256 ko'pchilik stsenariylar uchun tavsiya etiladi: barcha qurilmalar tomonidan qo'llab-quvvatlanadi va 128-bitli xavfsizlik darajasini ta'minlaydi.

HMAC (Hash-based Message Authentication Code) — xabarlarning simmetrik autentifikatsiyasi. Qo'llab-quvvatlanadigan hash funksiyalari: SHA-256, SHA-384, SHA-512. HMAC ma'lumotlarning yaxlitligi va haqiqiyligini tekshirish uchun ishlatiladi, masalan, webhook so'rovlarini tekshirish yoki konfiguratsiya yaxlitligini tekshirish uchun.

Barcha algoritmlar KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true) orqali biometrik autentifikatsiyaga bog'lanishi mumkin. Android 11+ da setUserAuthenticationParameters() flagi mavjud bo'lib, u kalit biometrik autentifikatsiyadan keyin qayta so'rovsiz mavjud bo'lgan vaqtni (soniyalarda) belgilash imkonini beradi.

Kod misollari: kalitlarni yaratish va ishlatish

Android Keystore bilan ishlashning amaliy misollarini Kotlin'da ko'rib chiqamiz: AES kalitini yaratish, ma'lumotlarni shifrlash va imzo uchun asimmetrik juftlik yaratish.

Keystore'da AES kalitini yaratish

Misol biometrik autentifikatsiyaga bog'langan 256-bitli AES/GCM kalitini yaratadi. Kalit getEncoded() orqali eksport uchun mavjud emas.

kotlin
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.security.KeyStore

private val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) }

fun generateAesKey(alias: String) {
    val spec = KeyGenParameterSpec.Builder(
        alias,
        KeyProperties.PURPOSE_ENCRYPT or
        KeyProperties.PURPOSE_DECRYPT
    )
    .setKeySize(256)
    .setBlockModes(KeyProperties.KEY_BLOCK_MODE_GCM)
    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
    .setUserAuthenticationRequired(true)
    .setInvalidatedByBiometricEnrollment(true)
    .build()

    val generator = KeyGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_AES,
        "AndroidKeyStore"
    )
    generator.init(spec)
    generator.generateKey()
}

AES/GCM ma'lumotlarini shifrlash

Misol Android Keystore kalitidan foydalanib ma'lumotlarni shifrlaydi. Cipher kalitni alias bo'yicha oladi, AES/GCM shifrlashni boshlaydi va IV bilan birga shifrlangan ma'lumotlarni qaytaradi.

kotlin
fun encryptData(alias: String, plaintext: ByteArray): ByteArray {
    val cipher = Cipher.getInstance("AES/GCM/NoPadding")
    val secretKey = keyStore.getKey(alias, null) as SecretKey
    cipher.init(Cipher.ENCRYPT_MODE, secretKey)

    val iv = cipher.getIV()
    val encrypted = cipher.doFinal(plaintext)

    // IV + shifrlangan ma'lumotlar
    return iv + encrypted
}

fun decryptData(alias: String, ciphertextWithIv: ByteArray): ByteArray {
    val iv = ciphertextWithIv.copyOfRange(0, 12)
    val encrypted = ciphertextWithIv.copyOfRange(12, ciphertextWithIv.size)

    val cipher = Cipher.getInstance("AES/GCM/NoPadding")
    val secretKey = keyStore.getKey(alias, null) as SecretKey
    val spec = GCMParameterSpec(128, iv)
    cipher.init(Cipher.DECRYPT_MODE, secretKey, spec)

    return cipher.doFinal(encrypted)
}

Imzo uchun RSA juftligini yaratish

Misol StrongBox ga bog'langan Keystore'da RSA-2048 kalit juftligini yaratadi. Shaxsiy kalit imzo uchun ishlatiladi, ochiq kalit getEncoded() orqali eksport qilinishi mumkin.

kotlin
fun generateRsaKeyPair(alias: String) {
    val spec = KeyGenParameterSpec.Builder(
        alias,
        KeyProperties.PURPOSE_SIGN or
        KeyProperties.PURPOSE_VERIFY
    )
    .setKeySize(2048)
    .setSignaturePaddings(
        KeyProperties.SIGNATURE_PADDING_RSA_PKCS1
    )
    .setDigests(KeyProperties.DIGEST_SHA256)
    .setIsStrongBoxBacked(true)
    .build()

    val pair = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_RSA,
        "AndroidKeyStore"
    ).apply { init(spec) }
     .generateKeyPair()

    // Ochiq kalitni eksport qilish mumkin
    val publicKey = pair.public // X509EncodedKeySpec
}

Android Keystore bilan ishlashning eng yaxshi amaliyotlari

Android Keystore dan samarali foydalanish unumdorlikni saqlab, maksimal himoyani ta'minlaydigan qoidalarga rioya qilishni talab qiladi.

KeyGenParameterSpec dan minimal zarur parametrlar bilan foydalaning: faqat haqiqatda ishlatiladigan purpose, block modes va paddings larni belgilang. Ortiqcha parametrlar (masalan, faqat imzo uchun ishlatiladigan kalit uchun PURPOSE_ENCRYPT) qo'shimcha hujum vektorlarini yaratadi. Android imzo uchun digest ni aniq belgilashni tavsiya qiladi — SHA256 minimal qabul qilinadigan daraja (SHA1 eskirgan).

Muhim operatsiyalar uchun kalitlarni biometriyaga bog'lang: setUserAuthenticationRequired(true) kalit faqat biometrik autentifikatsiyadan keyin ishlatilishi mumkinligini kafolatlaydi. Android 11+ da bir sessiya doirasida har bir operatsiya uchun biometriyani talab qilmaslik uchun setUserAuthenticationParameters() dan vaqt chegarasi bilan (tavsiya etilgan 30–60 soniya) foydalaning. setInvalidatedByBiometricEnrollment(true) yangi barmoq izi yoki yuz qo'shilganda kalitni avtomatik o'chiradi ‒ bu eski biometrik ma'lumotlar bilan kirishni oldini oladi.

Ishga tushirish bosqichida xavfsizlik darajasini tekshiring: SECURITY_LEVEL ni aniqlash uchun KeyStore.getKeyCharacteristics() dan foydalaning. Agar qurilma faqat dasturiy Keystore ni qo'llab-quvvatlasa (SECURITY_LEVEL_SOFTWARE), qaror qabul qiling: yoki funksiyadan voz keching, yoki qo'shimcha shifrlashdan foydalaning (masalan, kalitni foydalanuvchi paroli bilan o'rash). StrongBox kafolatlanmagan bo'lsa, unga tayanmang — har doim setIsStrongBoxBacked(true) flagini belgilang va natijani getKeyCharacteristics orqali tekshiring.

Kalitlarni jadval bo'yicha yangilang: kriptografik kalitlarning tavsiya etilgan ishlash muddati bor. NIST SP 800-57 AES kalitlarini har 1–2 yilda, RSA/EC juftliklarini har 2–3 yilda almashtirishni tavsiya qiladi. Kalit aylanishi mexanizmini amalga oshiring: ilova ishga tushganda kalitning yaratilish sanasini tekshiring (KeyGenParameterSpec.Builder.setKeyValidityStart/End) va muddat tugaganda yangi kalit yarating. Eski kalit bilan shifrlangan eski ma'lumotlar shifrdan chiqarilishi va yangisi bilan qayta shifrlanishi kerak.

Keystore dan katta ma'lumotlar uchun foydalanmang: Keystore kalitlarni saqlash uchun mo'ljallangan (bir necha yuz bayt), katta fayllarni shifrlash uchun emas. Ma'lumotlarni shifrlash uchun sxemadan foydalaning: tasodifiy AES kalitini (DEK — Data Encryption Key) yarating, ma'lumotlarni ushbu kalit bilan shifrlang, DEK ni esa Keystore kaliti (KEK — Key Encryption Key) bilan shifrlang. Android EncryptedSharedPreferences aynan ushbu sxemadan foydalanadi: master kalit Keystore'da, ma'lumotlar esa AES-256 GCM bilan shifrlanadi.

Tez-tez so'raladigan savollar

Android Keystore dan shaxsiy kalitni olish mumkinmi?

Yo'q, Android Keystore shaxsiy kalit hech qachon TEE yoki StrongBox ni tark etmasligi uchun mo'ljallangan. getEncoded() metodi Keystore'da yaratilgan kalitlar uchun null qaytaradi. Kalit faqat Cipher, Signature yoki Mac API orqali ishlatilishi mumkin — xom ashyo mavjud emas.

TEE va StrongBox o'rtasidagi farq nima?

TEE (TrustZone) — bir xil protsessorda virtual izolyatsiya, vaqt taqsimotidan foydalanadi. StrongBox — o'z CPU va xotirasiga ega alohida chip. StrongBox xavfsizroq (Common Criteria EAL 4+), lekin sekinroq va kamroq algoritmlarni qo'llab-quvvatlaydi. TEE tez-tez operatsiyalar uchun, StrongBox esa muhim kalitlar uchun mos keladi.

Qurilma StrongBox ni qo'llab-quvvatlashini qanday tekshirish mumkin?

setIsStrongBoxBacked(true) flagi bilan kalit yaratgandan so'ng KeyStore.getKeyCharacteristics() dan foydalaning. SECURITY_LEVEL_STRONGBOX atributi apparat qo'llab-quvvatlashini tasdiqlaydi. Agar qurilma StrongBox ni qo'llab-quvvatlamasa, Keystore xatosiz TEE ga o'tadi — xavfsizlik darajasini aniq tekshirish kerak.

Ilova o'chirilganda kalitlarga nima bo'ladi?

Keystore kalitlari ilova qurilmadan o'chirilganda avtomatik o'chiriladi. Android 10+ da ilova manifestda allowBackup=true flagiga ega bo'lsa, kalitlar saqlanib qolishi mumkin, ammo qayta o'rnatishdan keyin mavjud bo'lmaydi. Toza o'rnatishda kalitlarni qayta yaratish tavsiya etiladi.

Bir kalitni bir nechta qurilmalarda ishlatish mumkinmi?

Yo'q, Android Keystore ma'lum bir qurilmaning apparatiga bog'langan. Bir qurilmaning TEE sinda yaratilgan kalitni boshqasiga o'tkazib bo'lmaydi. Platformalararo shifrlash uchun sxemadan foydalaning: Keystore kalitni qurilmada himoya qiladi, sessiya kalitlari esa asimmetrik shifrlash bilan himoyalangan API orqali uzatiladi.

Xulosa

  • Android Keystore — kriptografik kalitlarni apparat-izolyatsiya qilingan muhitda (TEE yoki StrongBox) himoya qilish uchun tizim provayderi.
  • TEE (TrustZone) — bir xil protsessorda virtual izolyatsiya, TrustZone li qurilmalarda Android 9+ uchun majburiy.
  • StrongBox — Common Criteria EAL 4+ sertifikatli maxsus xavfsizlik chipi, setIsStrongBoxBacked(true) orqali yoqiladi.
  • KeyGenParameterSpec — kalit parametrlarini sozlash uchun markaziy sinf: algoritm, hajm, biometrik bog'lanish va aylanish.
  • Kalitlarni chiqarib bo'lmaydi — shaxsiy material getEncoded() orqali mavjud emas, operatsiyalar TEE/StrongBox ichida bajariladi.
  • Tavsiya etilgan algoritmlar — shifrlash uchun AES/GCM/NoPadding (256 bit), imzo uchun EC P-256, asimmetrik stsenariylar uchun RSA 2048.
  • KEK/DEK sxemasi — Keystore ma'lumotlarni shifrlash kalitlarini himoya qilish uchun master kalitni saqlaydi, unumdorlik va xavfsizlikni ta'minlaydi.

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