Android Keystore — izolasiya edilmiş icra mühitində (TEE) şifrələmə açarlarını yaradan və saxlayan kriptoqrafik provayderdir və hətta əməliyyat sistemi üçün də əlçatmazdır. AOSP Security Documentation (2025)-nın məlumatlarına görə, Keystore Google Play top-100-dəki Android tətbiqlərinin 80%-dən çoxunda tokenlərin qorunması və məlumatların şifrələnməsi üçün istifadə olunur. Android Keystore-u başa düşmək Android-də açarların təhlükəsiz saxlanması üçün kritik əhəmiyyət daşıyır.
Başlıca
Android Keystore — qorunan mühitdə kriptoqrafik açarların yaradılması, saxlanması və istifadəsi üçün API təmin edən Android platformasının sistem komponentidir. Proqram kriptoqrafik kitabxanalarından (Bouncy Castle, Conscrypt) fərqli olaraq, Keystore şəxsi açarların heç vaxt izolasiya edilmiş icra sahəsini tərk etməyəcəyinə zəmanət verir.
Keystore Android 4.3-də (API 18) RSA dəstəyi ilə proqram provayderi kimi meydana çıxdı. Android 6.0-dan (API 23) başlayaraq, Keystore Keymaster Hardware Abstraction Layer (HAL) vasitəsilə aparat dəstəyi aldı və kriptoqrafik əməliyyatları uyğun cihazlarda Trusted Execution Environment (TEE)-yə həvalə edir. Android Compatibility Definition Document (2025)-a görə, Android 9+ olan bütün cihazlar TEE və ya StrongBox vasitəsilə aparat Keystore-nı dəstəkləməlidir.
Keystore-dakı açarlar alias (ləqəb) ilə müəyyən edilir — açarın yaradılması və ya yüklənməsi zamanı ötürülən sətir. Keystore açarın xammalını əldə etməyə imkan vermir: getEncoded() metodu Keystore-da yaradılmış açarlar üçün null qaytarır. Bu, proqram açarlarından fundamental fərqdir — hücumçu cihaz üzərində tam nəzarət olsa belə şəxsi açarı çıxara bilməz.
Keystore Android-in digər təhlükəsizlik mexanizmləri ilə inteqrasiya olunub: biometrik autentifikasiya (BiometricPrompt), fayl səviyyəsində şifrələmə (File-Based Encryption) və SafetyNet / Play Integrity doğrulama funksiyaları. Açarlar müəyyən şərtlər daxilinde avtomatik silinmək üçün konfiqurasiya edilə bilər: kod-parolun silinməsi, yeni barmaq izinin əlavə edilməsi və ya müddətin bitməsi ilə.
Android Keystore arxitekturası aparat qorunma dərəcəsinə görə fərqlənən üç tətbiq səviyyəsini əhatə edir. Səviyyə cihazın aparat imkanlarından asılıdır.
TEE (Trusted Execution Environment) — eyni prosessorda əsas ŞİS ilə paralel işləyən izolasiya edilmiş sahədir. TEE ARM TrustZone texnologiyasından istifadə edir, bu da fiziki prosessor nüvəsini iki virtual hissəyə ayırır: Normal World (Android) və Secure World (TEE). Secure World-dəki kod Normal World-ə əlçatmayan yaddaş və periferiya cihazlarına çıxış əldə edə bilər.
Tətbiq Keystore vasitəsilə kriptoqrafik əməliyyat çağırdıqda, sorğu Keymaster HAL vasitəsilə TEE-yə ötürülür və əməliyyat aparat tərəfindən yerinə yetirilir. Nəticə tətbiqə qaytarılır, lakin şəxsi açar TEE-nin qorunan yaddaşında qalır. TEE GlobalPlatform TEE Protection Profile-ə uyğun sertifikatlaşdırılıb və TrustZone dəstəkləyən prosessorlu cihazlarda Android 9+ üçün məcburi tələbdir.
TEE AES/GCM (128, 256 bit), RSA (2048, 4096 bit), EC (P-256, P-384, P-521) və HMAC-SHA256 alqoritmlərini dəstəkləyir. TEE-nin məhsuldarlığı proqram kriptoqrafiyasından aşağıdır (20–40% aşağı), lakin tipik əməliyyatlar üçün (JWT imzası, sessiya açarının şifrədən açılması) gecikmə 10–50 ms-dən çox olmur.
StrongBox — əsas prosessordan fiziki olaraq ayrılmış xüsusi təhlükəsizlik çipi. TEE-dən fərqli olaraq (Android ilə prosessor vaxtını paylaşır), StrongBox öz CPU, operativ yaddaş, True Random Number Generator (TRNG) və qorunan yaddaşa (One-Time Programmable memory) malikdir. StrongBox Common Criteria EAL 4+ və Secure IC Protection Profile üzrə sertifikatlaşdırılıb.
StrongBox Android 9+ olan cihazlarda müvafiq çip olduqda ələgatəndir (məsələn, Google Pixel-də Titan M, Samsung Galaxy-də Knox). Tərtibatçı StrongBox-u KeyGenParameterSpec-də setIsStrongBoxBacked(true) bayrağı ilə aktivləşdirir. Aparat dəstəyi olmadıqda bayraq nəzərə alınmır və Keystore TEE-yə keçir.
StrongBox məhdudiyyətləri: məhdud alqoritm dəsti (AES-256, EC P-256, HMAC-SHA256), əməliyyat növbəsi — eyni anda birdən çox deyil, əməliyyatların sayı çipin resursları ilə məhdudlaşır. StrongBox yüksək yüklənmə ssenariləri üçün nəzərdə tutulmayıb — tez-tez əməliyyatlar üçün TEE-dən, kritik açarlar üçün isə StrongBox-dan istifadə edin (master şifrələmə açarları, imza açarları).
Software-based Keystore — TEE və ya StrongBox aparat dəstəyi olmayan cihazlarda istifadə edilən proqram tətbiqidir. Açarlar fayl sistemində şifrələnmiş formada saxlanılır, lakin şəxsi açar müvəqqəti olaraq operativ yaddaşda şifrədən açıla bilər. Proqram Keystore daha az təhlükəsizdir — root girişi olan hücumçu yaddaşdakı açarı ələ keçirə bilər.
Android 12-dən (API 31) etibarən, Google bütün yeni cihazlar üçün aparat Keystore dəstəyi tələb edir. Android 9–11 olan cihazlar büdcə modellərində proqram Keystore-a malik ola bilər. Tərtibatçı KeyStore.getKeyCharacteristics() vasitəsilə qorunma səviyyəsini yoxlaya bilər — SECURITY_LEVEL_TRUSTED_ENVIRONMENT və ya SECURITY_LEVEL_STRONGBOX atributu aparat qorunmasını təsdiqləyir.
Android Keystore açar növündən asılı olaraq kateqoriyalara bölünmüş geniş kriptoqrafik alqoritmlər dəstini dəstəkləyir. Alqoritm seçimi məhsuldarlığa, uyğunluğa və təhlükəsizlik səviyyəsinə təsir edir.
AES (Advanced Encryption Standard) — cihazda məlumatların qorunması üçün simmetrik şifrələmə. Tövsiyə olunan rejim: AES/GCM/NoPadding (256 bit). GCM autentifikasiya edilmiş şifrələmə (AEAD) təmin edir — şifrələnmiş məlumatların bütövlüyünün yoxlanılması. IV (İlkinləşdirmə Vektoru) ölçüsü: GCM üçün 12 bayt. AES/ECB-dən istifadə etməyin — lazımi qorunma təmin etmir.
RSA (Rivest–Shamir–Adleman) — sessiya açarlarının qorunması və rəqəmsal imza üçün asimmetrik şifrələmə. Tövsiyə olunan ölçü: 2048 və ya 4096 bit. Rejimlər: RSA/ECB/PKCS1Padding (şifrələmə) və RSA/ECB/PKCS1Sign (imza). RSA 1024 köhnəlmiş hesab olunur və yeni tətbiqlər üçün tövsiyə edilmir (NIST SP 800-131A Rev. 2).
EC (Elliptic Curve) — imza və açar mübadiləsi üçün elliptik əyrilər üzərində asimmetrik kriptoqrafiya. Dəstəklənən əyrilər: secp256r1 (P-256, məcburi), secp384r1 (P-384) və secp521r1 (P-521). EC eyni təhlükəsizliyi əhəmiyyətli dərəcədə kiçik açar ölçüsü ilə təmin edir. P-256 əksər ssenarilər üçün tövsiyə olunur: bütün cihazlar tərəfindən dəstəklənir və 128-bit təhlükəsizlik səviyyəsi təmin edir.
HMAC (Hash-based Message Authentication Code) — mesajların simmetrik autentifikasiyası. Dəstəklənən heş funksiyaları: SHA-256, SHA-384, SHA-512. HMAC məlumatların bütövlüyünün və həqiqiliyinin yoxlanılması üçün istifadə olunur, məsələn webhook sorğularının doğrulanması və ya konfiqurasiyanın bütövlüyünün yoxlanılması üçün.
Bütün alqoritmlər KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true) vasitəsilə biometrik autentifikasiyaya bağlana bilər. Android 11+-da setUserAuthenticationParameters() bayrağı mövcuddur və açarın biometrik autentifikasiyadan sonra təkrari sorğu olmadan ələgatər olduğu müddəti (saniyələrlə) təyin etməyə imkan verir.
Android Keystore ilə işləmənin praktik nümunələrinə Kotlin-də baxaq: AES açarının yaradılması, məlumatların şifrələnməsi və imza üçün asimmetrik cütlüyün yaradılması.
Nümunə biometrik autentifikasiyaya bağlı 256-bit AES/GCM açarı yaradır. Açar getEncoded() vasitəsilə ixrac üçün əlçatmazdır.
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()
}
Nümunə Android Keystore-dan açardan istifadə edərək məlumatları şifrələyir. Cipher açarı alias üzrə əldə edir, AES/GCM şifrələməni başlatdırır və IV ilə birlikdə şifrələnmiş məlumatları qaytarır.
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 + şifrələnmiş məlumatlar
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)
}
Nümunə StrongBox-a bağlı Keystore-da RSA-2048 açar cütlüyü yaradır. Şəxsi açar imza üçün istifadə olunur, açıq açar getEncoded() vasitəsilə ixrac edilə bilər.
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()
// Açıq açarı ixrac etmək olar
val publicKey = pair.public // X509EncodedKeySpec
}
Android Keystore-dan səmərəli istifadə məhsuldarlığı qoruyaraq maksimal qorunma təmin edən qaydalara riayət etməyi tələb edir.
KeyGenParameterSpec-dən minimal zəruri parametrlərlə istifadə edin: yalnız həqiqətən istifadə olunan purpose, block modes və paddings-ləri göstərin. Həddindən artıq parametrlər (məsələn, yalnız imza üçün istifadə olunan açar üçün PURPOSE_ENCRYPT) əlavə hücum vektorları yaradır. Android imza üçün açıq şəkildə digest təyin etməyi tövsiyə edir — SHA256 minimal məqbul səviyyədir (SHA1 köhnəlmişdir).
Kritik əməliyyatlar üçün açarları biometriyaya bağlayın: setUserAuthenticationRequired(true) açarın yalnız biometrik autentifikasiyadan sonra istifadə edilə biləcəyinə zəmanət verir. Android 11+-da bir sessiya çərçivəsində hər əməliyyat üçün biometrik tələb etməmək üçün setUserAuthenticationParameters()-dən vaxt limiti ilə (tövsiyə olunan 30–60 saniyə) istifadə edin. setInvalidatedByBiometricEnrollment(true) yeni barmaq izi və ya üz əlavə edildikdə açarı avtomatik silir — bu köhnə biometrik məlumatlarla girişin qarşısını alır.
Başlatma mərhələsində təhlükəsizlik səviyyəsini yoxlayın: SECURITY_LEVEL müəyyən etmək üçün KeyStore.getKeyCharacteristics() istifadə edin. Cihaz yalnız proqram Keystore-nı dəstəkləyirsə (SECURITY_LEVEL_SOFTWARE), qərar verin: ya funksionallıqdan imtina edin, ya da əlavə şifrələmədən istifadə edin (məsələn, açarı istifadəçi şifrəsi ilə bükmək). StrongBox zəmanətli deyilsə, ona güvənməyin — həmişə setIsStrongBoxBacked(true) bayrağını təyin edin və nəticəni getKeyCharacteristics vasitəsilə yoxlayın.
Açarları cədvəl üzrə yeniləyin: kriptoqrafik açarların tövsiyə olunan ömrü var. NIST SP 800-57 AES açarlarının hər 1–2 ildə, RSA/EC cütlüklərinin hər 2–3 ildə dəyişdirilməsini tövsiyə edir. Açar rotasiyası mexanizmini tətbiq edin: tətbiq başdaşdıqda açarın yaradılma tarixini yoxlayın (KeyGenParameterSpec.Builder.setKeyValidityStart/End) və müddət bitdikdə yeni açar yaradın. Köhnə açarla şifrələnmiş köhnə məlumatlar şifrədən açılmalı və yenisi ilə yenidən şifrələnməlidir.
Keystore-dan böyük məlumatlar üçün istifadə etməyin: Keystore açarların saxlanması üçün nəzərdə tutulub (bir neçə yüz bayt), böyük faylların şifrələnməsi üçün deyil. Məlumatların şifrələnməsi üçün sxemdən istifadə edin: təsadüfi AES açarı (DEK — Data Encryption Key) yaradın, məlumatları bu açarla şifrələyin, DEK-i isə Keystore açarı (KEK — Key Encryption Key) ilə şifrələyin. Android EncryptedSharedPreferences məhz bu sxemdən istifadə edir: master açar Keystore-da, məlumatlar isə AES-256 GCM ilə şifrələnir.
Tez-tez verilən suallar
Xeyr, Android Keystore şəxsi açarın heç vaxt TEE və ya StrongBox-u tərk etməməsi üçün nəzərdə tutulmuşdur. getEncoded() metodu Keystore-da yaradılmış açarlar üçün null qaytarır. Açar yalnız Cipher, Signature və ya Mac API vasitəsilə istifadə edilə bilər — xammal əlçatmazdır.
TEE (TrustZone) — eyni prosessorda virtual izolasiya, vaxt bölgüsündən istifadə edir. StrongBox — öz CPU və yaddaşı olan ayrıca çip. StrongBox daha təhlükəsizdir (Common Criteria EAL 4+), lakin daha yavaşdır və daha az alqoritm dəstəkləyir. TEE tez-tez əməliyyatlar üçün, StrongBox isə kritik açarlar üçün uyğundur.
setIsStrongBoxBacked(true) bayrağı ilə açar yaratdıqdan sonra KeyStore.getKeyCharacteristics()-dən istifadə edin. SECURITY_LEVEL_STRONGBOX atributu aparat dəstəyini təsdiqləyir. Cihaz StrongBox-u dəstəkləmirsə, Keystore xətasız olaraq TEE-yə keçir — təhlükəsizlik səviyyəsini açıq şəkildə yoxlamaq lazımdır.
Keystore-dakı açarlar tətbiq silindikdə avtomatik silinir. Android 10+-da tətbiqin manifestində allowBackup=true bayrağı varsa, açarlar qoruna bilər, lakin yenidən quraşdırmadan sonra əlçatmaz olacaq. Təmiz quraşdırma zamanı açarların yenidən yaradılması tövsiyə olunur.
Xeyr, Android Keystore müəyyən cihazın aparatına bağlıdır. Bir cihazın TEE-sində yaradılmış açar digərinə ötürülə bilməz. Platformalararası şifrələmə üçün sxemdən istifadə edin: Keystore cihazda açarı qoruyur, sessiya açarları isə asimmetrik şifrələmə ilə qorunan API vasitəsilə ötürülür.
Nəticələr
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