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-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 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.
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.
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.
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.
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).
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()
}
}
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.
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. X25519 və Ed25519 — 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.
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.
| Alqoritm | Keymaster | Təyinat | API |
|---|---|---|---|
| RSA | KM 1.0+ | İmza, şifrələmə | 18+ |
| EC | KM 1.0+ | ECDSA, ECDH | 18+ |
| AES | KM 2.0+ | Simmetrik şifrələmə | 23+ |
| HMAC | KM 2.0+ | Autentifikasiya kodu | 23+ |
| ChaCha20 | KM 3.0+ | Axın şifrələmə | 31+ |
| X25519/E25519 | KM 3.0+ | Açar mübadiləsi | 31+ |
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.
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.
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).
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)
}
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.
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()
}
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 — 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.
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
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.
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.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.
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.
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ə
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.
Həm də oxuyun