KeyStore (Android): əsas anlayışlar, API və kriptoqrafik anbarın işi

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

KeyStore (Android) — bu, Java Cryptography Architecture (JCA) kriptoqrafik provayderinin Android-də təhlükəsiz açar saxlanması üçün aparat izolyasiyası imkanı ilə inteqrasiya olunmuş tətbiqidir. Android 4.3-dən (API 18) etibarən KeyStore Keymaster HAL vasitəsilə aparat açarlarını dəstəkləyir, Android 9-dan (API 28) isə ayrılmış Secure Element-də açarlar üçün StrongBox Keymaster-ı dəstəkləyir. Android Security Documentation-a görə, “AndroidKeyStore” provayderi standart Bouncy Castle və ya OpenSSL KeyStore-u əvəz edərək, açarların icazəsiz çıxarılmasından sistem qorunması təmin edir.

Əsas məqamlar

  • Android KeyStore — TEE, StrongBox və biometrik qoruma dəstəyi ilə açarların saxlanması üçün JCA provayderi
  • KeyGenParameterSpec açar yaradılarkən alqoritm, təyinat, digest, padding və biometriyanı təyin edir
  • Keymaster HAL Software, TEE və StrongBox səviyyələrində aparat kriptoqrafik əməliyyatları həyata keçirir
  • Key Attestation (API 28+) serverə açarın Android KeyStore-un aparat mühitində yaradıldığını yoxlamağa imkan verir
  • Açar aliası — tətbiqin Keystore-da açara müraciət etdiyi sətir; bir alias bir açara uyğun gəlir

Android-də KeyStore nədir?

Android-də KeyStore — bu ayrıca tətbiq və ya fayl deyil, java.security.KeyStore interfeysini həyata keçirən kriptoqrafik provayderdir. O, şəxsi açarların, simmetrik açarların və etibarlı mərkəzlərin (CA) sertifikatlarının saxlanması və istifadəsi üçün vahid API təmin edir. Provayder “AndroidKeyStore” adı altında qeydiyyatdan keçir və standart KeyStore.getInstance() vasitəsilə əldə edilir.

Android KeyStore-un təkamülü

Android 4.3-dən əvvəl kriptoqrafik əməliyyatlar Bouncy Castle vasitəsilə proqram şəklində yerinə yetirilirdi. Android 4.3 ilə ARM TrustZone-da TEE istifadəsinə imkan verən Keymaster HAL 1.0 ortaya çıxdı. Android 6.0 (API 23) barmaq izi ilə aparat autentifikasiyası dəstəyi ilə Keymaster 2.0 əlavə etdi. Android 9 (API 28) Keymaster 4.0 və ayrılmış Secure Element üçün StrongBox Keymaster təqdim etdi.

Keymaster-ın hər versiyası yeni imkanlar əlavə edir və açarların izolyasiyasını yaxşılaşdırır. Müasir cihazlar (2022+) Google Mobile Services sertifikasiyası üçün Keymaster 4.0-ı dəstəkləməlidir ki, bu da bütün Android tətbiqləri üçün TEE-nin mövcudluğunu təmin edir.

Arxitektura və komponentlər

Android KeyStore üç səviyyədən ibarətdir: Java API (KeyStore, KeyPairGenerator), sistem prosesi keystore (C++, system service kimi işləyir) və Keymaster HAL (TEE və ya Secure Element-də kitabxana). Tətbiq API-ni çağırır, keystore xidməti sorğunu Keymaster-a yönləndirir, əməliyyat qorunan mühitdə yerinə yetirilir.

Bütün şəxsi açarlar TEE-də saxlanılır və istifadəçi məkanından oxuna bilməz. Hətta sistem keystore xidmətinin də xam açarlara çıxışı yoxdur — yalnız Keymaster daxilindəki açarlara işarə edən tutacaqlara.

KeyStore kriptoprovayder kimi necə işləyir?

Android KeyStore standart JCA xidmət təminatçısı interfeysini həyata keçirir. Tətbiq Cipher.getInstance(“RSA/ECB/PKCS1Padding”, “AndroidKeyStore”) çağırdıqda, Android Security Provider əməliyyatı zəncir vasitəsilə Keymaster-a ötürür: Java → JNI → keystore service → Keymaster HAL.

Provayderin qeydiyyatı

AndroidKeyStore provayderi proses işə düşərkən avtomatik qeydiyyatdan keçir. Onun prioriteti Bouncy Castle və ya Conscrypt-dən yüksəkdir. Buna görə də KeyStore.getInstance() provaydersiz çağırıldıqda əksər hallarda AndroidKeyStore qaytarılır. Açıq çağırış üçün KeyStore.getInstance(“AndroidKeyStore”) istifadə edin.

Hər bir Android tətbiqi KeyStore-da izolə olunmuş konteynerə malikdir. Eyni UID-yə (shared userId) malik tətbiqlər müəyyən açarlara birgə girişə malik ola bilər, lakin standart qurulum tətbiq A-nın tətbiq B-nin açarlarını oxuya bilməyəcəyini təmin edir.

KeyStore metodları və onların xüsusiyyətləri

load(null) — KeyStore-un işə salınması. Parametr AndroidKeyStore üçün həmişə null-dır. setEntry — açarın KeyProtection (purposes, digest, padding) göstərilməklə saxlanması. getEntry — KeyStore.PrivateKeyEntry, SecretKeyEntry və ya TrustedCertificateEntry-nin əldə edilməsi. containsAlias — açarın mövcudluğunun yoxlanması. deleteEntry — açarın silinməsi (geri qaytarılmayan).

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

object KeyStoreManager {
    private val keyStore by lazy {
        KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
    }

    fun createRsaKey(alias: String) {
        val spec = KeyGenParameterSpec.Builder(alias,
            KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
        ).setKeySize(2048)
         .setDigests(KeyProperties.DIGEST_SHA256)
         .setSignaturePaddings(KeyProperties.SIGN_PADDING_RSA_PKCS1)
         .build()

        val kpg = KeyPairGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_RSA,
            "AndroidKeyStore"
        )
        kpg.initialize(spec)
        kpg.generateKeyPair()
    }
}

Dəstəklənən alqoritmlər və açar növləri

Android KeyStore cihazdakı Keymaster HAL versiyasından asılı olaraq dəyişən geniş kriptoqrafik alqoritmlər dəstəyini təmin edir. Tərtibatçı yaradılma zamanı KeyGenParameterSpec.Builder vasitəsilə dəstəklənən alqoritmlərin siyahısını əldə edə bilər — uyğunsuz parametrlər InvalidAlgorithmParameterException yaradır.

Asimmetrik alqoritmlər

RSA (1024–4096 bit) — imza (PKCS1, PSS SHA-1/SHA-256/SHA-384/SHA-512 ilə) vɗ şifrələmə (OAEP SHA-1/SHA-256 ilə). EC (P-224, P-256, P-384, P-521) — ECDSA imzası və ECDH açar razılaşdırması üçün. X25519Ed25519 — Android 12-dən (API 31) müastr kriptoqrafik protokollar üçün.

Asimmetrik açarlar üçün Həmişə Keymaster daxilində yaradın, Şəxsi açarları HEÇ VAXT idxal etməyin. İdxal edilmiş şəxsi açarlar aparat qorumasına malik deyil — onlar proqram qatında saxlanılır və AP kompromitasiyası zamanı zəifdir.

Simmetrik alqoritmlər

AES (128, 256 bit) — CBC, CTR, GCM rejimlərində simmetrik şifrələmə üçün. HMAC (SHA-1, SHA-256, SHA-512) — mesajların autentifikasiyası üçün. ChaCha20 (Android 12+) — Poly1305 autentifikasiyası ilə yüksək performanslı axın şifrələməsi üçün.

AlqoritmKeymasterTəyinatAPI
RSAKM 1.0+İmza, şifrələmə18+
ECKM 1.0+ECDSA, ECDH18+
AESKM 2.0+Simmetrik şifrələmə23+
HMACKM 2.0+Autentifikasiya kodu23+
ChaCha20KM 3.0+Axın şifrələmə31+
X25519/E25519KM 3.0+Açar mübadiləsi31+

Açar növləri və onların seriyalaşdırılması

KeyStore.PrivateKeyEntry — şəxsi açar (ixrac edilməyən) və sertifikat zəncirini ehtiva edir. KeyStore.SecretKeyEntry — simmetrik açarlar üçün. KeyStore.TrustedCertificateEntry — etibarlı CA sertifikatları üçün. Açıq açarlar keyStore.getCertificate(alias).publicKey vasitəsilə ixrac üçün əldə edilir.

Açarların yaradılması və istifadəsi nümunəsi

Tam ssenarini nəzərdən keçirək: məlumatların şifrələnməsi üçün AES açarının yaradılması və biometrik qoruma ilə imza üçün EC açarının yaradılması. Hər iki açar aparat dəstəyi ilə Android KeyStore daxilində yaradılır.

Şifrələmə üçün AES açarının yaradılması

AES açarı KeyGenParameterSpec ilə KeyGenerator vasitəsilə yaradılır. Parametrlər: PURPOSE_ENCRYPT + PURPOSE_DECRYPT, BLOCK_MODE_GCM (autentifikasiya ilə tövsiyə olunan rejim), ENCRYPTION_PADDING_NONE (GCM üçün padding lazım deyil).

kotlin
import javax.crypto.KeyGenerator
import javax.crypto.Cipher
import javax.crypto.spec.GCMParameterSpec

fun generateAndEncrypt(alias: String, plainText: ByteArray): ByteArray {
    val spec = KeyGenParameterSpec.Builder(alias,
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
    ).setBlockModes(KeyProperties.BLOCK_MODE_GCM)
     .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
     .setKeySize(256)
     .build()

    val kg = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
    kg.initialize(spec)
    kg.generateKey()

    val cipher = Cipher.getInstance("AES/GCM/NoPadding")
    cipher.init(Cipher.ENCRYPT_MODE, getKeyFromStore(alias))
    return cipher.doFinal(plainText)
}

Biometrik qoruma ilə imza

EC açarı userAuthenticationRequired=true ilə hər imza əməliyyatından əvvəl istifadəçinin autentifikasiyasını tələb edir. Bunun üçün Signature obyektini ehtiva edən CryptoObject ilə BiometricPrompt istifadə olunur. Uğurlu biometriyadan sonra Keymaster əməliyyata icazə verir.

kotlin
fun createBiometricSignKey(alias: String) {
    val spec = KeyGenParameterSpec.Builder(alias,
        KeyProperties.PURPOSE_SIGN
    ).setAlgorithmParameterSpec(
        ECGenParameterSpec("secp256r1")
    ).setDigests(KeyProperties.DIGEST_SHA256)
     .setUserAuthenticationRequired(true)
     .setInvalidatedByBiometricEnrollment(true)
     .build()

    val kpg = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_EC,
        "AndroidKeyStore"
    )
    kpg.initialize(spec)
    kpg.generateKeyPair()
}

KeyStore və cihazda təhlükəsizlik

Android KeyStore proqram KeyStore-ların (JKS, BKS) təmin edə bilmədiyi aparat təhlükəsizlik təminatlarını verir. Açarlar SoC səviyyəsində qorunur və Android istifadəçi məkanı üzərində tam nəzarət belə şəxsi açarın çıxarılmasına imkan vermir.

Key Attestation (Android 8.1+)

Key Attestation — tətbiqə (və serverə) açarın hansı mühitdə yaradıldığını yoxlamağa imkan verən mexanizmdir. Android Keystore açarın xüsusiyyətlərinin siyahısını ehtiva edən sertifikatı imzalayır: alqoritm, ölçü, purges, hardware-backed (True/False), origin (GENERATED, IMPORTED). Server sertifikatlar zəncirini Google kök sertifikatına qədər yoxlayır.

Bu, maliyyə tətbiqləri üçün kritik əhəmiyyət kəsb edir: server açarın aparat mühitində yaradılmasını tələb edə bilər (Hardware-Backed = True) və proqram Keystore-da yaradılmış açarları rədd edə bilər. Key Attestation təcavüzkarların Keystore-u emulyatorla əvəz etdiyi hücumların qarşısını alır.

Biometriya dəyişikliyində açarların etibarsızlaşdırılması

setInvalidatedByBiometricEnrollment(true) o deməkdir ki, istifadəçinin biometrik şablonları dəyişdirildikdə və ya silindikdə açar Keymaster tərəfindən avtomatik silinəcək. Bu, təcavüzkärın mövcud hesaba öz barmaq izini əlavə etdiyi hücumlardan qorunmadır. Yeni barmaq izi əlavə edildikdən sonra köhnə açarlar əlçatmaz olur.

Uğursuz biometrik autentifikasiya cəhdlərinin sayı da Keymaster tərəfindən idarə olunur. maxBiometricAttempt-dən sonra (istehsalçı tərəfindən təyin edilir, adətən 5) Keymaster biometrik açarlarla bütün əməliyyatları 30 saniyəyə bloklayır. 10 uğursuz cəhddən sonra — cihaz şifrəsi (məxfi PIN) daxil edilənə qədər.

Tez-tez verilən suallar

Android KeyStore və Bouncy Castle KeyStore arasındakı fərq nədir?

Bouncy Castle (BKS) — açarları şifrə ilə qorunan faylda saxlayan proqram KeyStore-dur. Android KeyStore TEE/StrongBox aparat izolyasiyasından istifadə edir. BKS açarları root girişi ilə çıxarıla bilər, Android KeyStore açarları isə çıxarıla bilməz. BKS CA sertifikatları üçün, Android KeyStore isə şəxsi açarlar üçün uyğundur.

Bir açarı həm şifrələmə, həm də imza üçün istifadə etmək olarmı?

Bəli, əgər yaradılma zamanı PURPOSE_ENCRYPT or PURPOSE_DECRYPT or PURPOSE_SIGN or PURPOSE_VERIFY göstərilsə. Bununla belə, ən yaxşı təcrübə müxtəlif əməliyyatlar üçün ayrı açarlar yaratmaqdır. Bu, açarlardan birinin kompromitasiyası zamanı zərəri məhdudlaşdırır və minimum imtiyaz prinsipinə uyğun gəlir.

Android KeyStore-da açarın aparat olduğunu necə yoxlamaq olar?

android.security.keystore vasitəsilə əldə edilən KeyStore.getKeyCharacteristics(alias) istifadə edin. Metod bayraqlar dəsti qaytarır: FLAG_HARDWARE — açar TEE-də, FLAG_SECURE_ELEMENT — açar StrongBox-da. Bayraqlar yoxdursa — açar proqramdır.

Bütün biometrik şablonlar silindikdə nə baş verir?

setInvalidatedByBiometricEnrollment(true) ilə yaradılmış bütün açarlar Keymaster tərəfindən avtomatik etibarsızlaşdırılacaq. İstifadə cəhdində tətbiq KeyPermanentlyInvalidatedException alacaq. Bu açarlarla şifrələnmiş məlumatlar geri qaytarılmayan şəkildə itiriləcək.

Android KeyStore açarların ehtiyat nüsxəsini dəstəkləyirmi?

Aparat açarları (TEE/StrongBox-da) ehtiyat nüsxəni dəstəkləmir — onlar müəyyən cihaza bağlıdır. Proqram açarları Google Drive ehtiyat nüsxəsinə daxil edilə bilər. Cihazlar arasında məlumat köçürmək üçün məlumatları serverdə şifrələyin və yeni cihazda şifrəni açın.

Nəticə

  • Android KeyStore — Keymaster HAL vasitəsilə TEE/StrongBox-da aparat izolyasiyalı açar saxlanması üçün JCA provayderi
  • KeyGenParameterSpec açarın alqoritmini, ölçüsünü, purges, digest, biometriyanı və vaxt məhdudiyyətlərini konfiqurasiya edir
  • RSA (KM 1.0+), EC (KM 1.0+), AES (KM 2.0+), ChaCha20 (KM 3.0+) — müxtəlif Keymaster səviyyələri ilə dəstəklənən alqoritmlər
  • Key Attestation (API 28+) server tərəfinə açarın aparat mənşəli yoxlamağa imkan verir
  • Biometrik açar qorunması setUserAuthenticationRequired + CryptoObject ilə BiometricPrompt vasitəsilə
  • Etibarsızlaşdırma biometriya dəyişikliyində açarların əlavə edilmiş barmaq izlərinin icazəsiz istifadəsinin qarşısını alır
  • Android tətbiqlərində aparat qorunması ilə kriptoqrafik açarların yaradılması və saxlanması üçün Android KeyStore-dan 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