Android Keystore, Android'de kriptografik anahtarları donanım izolasyonunda güvenli bir şekilde depolamak için bir sistem mekanizmasıdır. Sistem, ARM TrustZone'lu cihazlarda Trusted Execution Environment (TEE) veya çip seviyesinde anahtarları korumak için özel bir Secure Element kullanır. Android Open Source Project'e göre Keystore, güvenli ortamda doğrudan anahtar oluşturma ile RSA, EC, AES ve HMAC algoritmalarını destekler.
Önemli Noktalar
Android Keystore, Android'de API 1'den (Android 1.0) itibaren uygulanan bir kriptografik sağlayıcıdır, ancak tam donanım desteği Android 4.3 (API 18) ile ortaya çıkmıştır. Keystore, özel anahtarların güvenli bir şekilde depolanması sorununu çözer, böylece işletim sistemi tehlikeye girse bile bir saldırgan anahtarları düz metin olarak çıkaramaz.
Android Keystore mimarisi üç katmandan oluşur: uygulama API'si (java.security.KeyStore), sistem hizmeti (keystore daemon) ve donanım katmanı (Keymaster HAL). Uygulama, standart Java Cryptography Architecture (JCA) API'si aracılığıyla erişir ve sistem hizmeti, istekleri TEE'de çalışan Keymaster'a yönlendirir.
Anahtarlarla ilgili tüm kriptografik işlemler (imzalama, şifre çözme) TEE veya Secure Element içinde gerçekleştirilir. Anahtarlar güvenli ortamı asla terk etmez — uygulama anahtara başvurmak için yalnızca bir tanıtıcı (takma ad) alır. Bu, anahtarların işlem belleğinde potansiyel olarak erişilebilir olduğu yazılım KeyStore'lardan temel bir farktır.
Standart JKS (Java KeyStore) veya BKS (Bouncy Castle) anahtarları parola korumalı dosyalarda saklar. Android Keystore anahtarları, root kullanıcıdan bile korundukları donanım izolasyonunda saklar. JKS doğrudan dosya sistemi erişimine karşı savunmasızdır; Android Keystore değildir.
Bir diğer fark: Android Keystore'da anahtarlar, oluşturma sırasında belirtilen katı kullanım parametrelerine (purpose — yalnızca sign/verify/encrypt/decrypt) sahiptir. Daha sonra değiştirilemezler, bu da anahtarın kötüye kullanılmasını önler.
Yeni bir anahtar oluştururken, uygulama gelecekteki anahtarın tüm parametrelerini içeren KeyGenParameterSpec ile KeyPairGenerator veya KeyGenerator'ı çağırır. Sistem, isteği Keymaster HAL'a iletir, Keymaster TEE içinde anahtarı oluşturur ve bir tanıtıcı döndürür.
KeyGenParameterSpec.Builder yöntemi zorunlu parametreleri kabul eder: Keystore'da anahtar adı, amaç (PURPOSE_SIGN, PURPOSE_ENCRYPT), algoritma (RSA, EC, AES). Ek olarak: digest (SHA-256), padding (PKCS7), userAuthenticationRequired (biyometri), keyValidityStart/End (zaman kısıtlamaları).
Parametreler ayarlandıktan sonra, KeyPairGenerator.generateKeyPair() bir KeyPair döndürür; burada PrivateKey, işlemleri Keymaster'a devreden bir nesnedir. Genel anahtar çıkarılabilir, özel anahtar çıkarılamaz. Yalnızca TEE içinde bulunur.
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()
}
ECDSA veya RSA-PSS için Signature, standart API aracılığıyla oluşturulur: Signature.getInstance(algorithm).initSign(privateKey). İmzalama işlemi TEE'de gerçekleştirilir: uygulama veriyi gönderir, Keymaster donanımda imzalar ve imzayı döndürür. Anahtar ve veri paylaşılan bellekte karışmaz.
Biyometrik koruma için, kullanıcının imzalamadan önce BiometricPrompt aracılığıyla kimlik doğrulaması yapması gerekir. Başarılı kimlik doğrulama olmadan Keymaster işlemi gerçekleştirmez ve CryptoAuthenticationException döndürür.
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 ile CryptoObject(signature) FaceID/PIN ister
}
Android iki anahtar depolama modunu destekler: yazılım (TEE'siz cihazlarda) ve donanım (TEE veya Secure Element'li cihazlarda). Mod, SoC yeteneklerine ve Android sürümüne bağlıdır.
Trusted Execution Environment olmayan cihazlarda (Android 4.3 öncesi veya düşük bütçeli SoC'ler), anahtarlar kilit ekranı parolasından türetilen bir ana anahtar kullanılarak şifrelenmiş olarak saklanır. Bu mod daha az güvenlidir — kriptografik işlemler sırasında anahtarlar işlem belleğinde erişilebilir durumdadır.
Koruma seviyesi, AES-256-GCM ile KeyStore dosyasının şifrelenmesine dayanır. Şifreleme anahtarı, kullanıcının parolası veya PIN'inden Scrypt (yüksek yineleme sayısına sahip PBKDF2) aracılığıyla oluşturulur.
Modern cihazlarda, TEE'de (ARM TrustZone) Keymaster 4.x kullanılır. Anahtarlar yalnızca TrustZone içinde oluşturulur, saklanır ve kullanılır. Linux çekirdeği bile özel anahtarlara erişemez — yalnızca Keymaster HAL işlemleri gerçekleştirebilir.
Secure Element (örneğin, Samsung Knox'da eSE veya Google Pixel 3+'da StrongBox), kendi işlemcisi ve belleği olan ayrı bir çiptir. Common Criteria EAL 4+ sertifikalıdır ve fiziksel kurcalamaya karşı koruma dahil maksimum koruma seviyesi sağlar.
| Tür | Depolama konumu | Koruma seviyesi | API'den itibaren kullanılabilir |
|---|---|---|---|
| Yazılım | Dosya /data/misc/keystore | Orta (AES-256) | API 1+ |
| Keymaster 3 | TEE (TrustZone) | Yüksek | API 23+ |
| Keymaster 4 | TEE + Secure I/O | Çok yüksek | API 28+ |
| StrongBox | Donanım Secure Element | Maksimum | API 28+, isteğe bağlı |
Android Keystore, Java Cryptography Architecture (JCA) ile entegredir. Sağlayıcıya erişmek için standart KeyStore.getInstance("AndroidKeyStore") kullanılır. API, API 18'den itibaren kullanılabilir.
KeyStore.load(null) yöntemi, uygulamanın KeyStore kapsayıcısını yükler. Parola gerekmez — Android, erişim kontrolü için uygulama bağlamını ve UID'sini kullanır. Paylaşılan bir UID kullanılmadıkça her uygulama yalnızca kendi girişlerini görür.
setEntry ve getEntry yöntemleri KeyStore.PrivateKeyEntry, SecretKeyEntry veya TrustedCertificateEntry ile çalışır. ProtectionParameter parametresi Android Keystore için her zaman null'dur (koruma sistem düzeyinde uygulanır).
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)
}
KeyCharacteristics kullanarak anahtarın hangi ortamda saklandığını belirleyebilirsiniz: yazılım KeyStore, TEE veya StrongBox. getKeyCharacteristics() yöntemi bir dizi bayrak döndürür: FLAG_HARDWARE (keymaster), FLAG_SECURE_ELEMENT (StrongBox), FLAG_TRUSTED_USER_PRESENCE_REQUIRED (biyometri).
Android Keystore, üç kategoriye ayrılmış geniş bir kriptografik algoritma yelpazesini destekler: asimetrik, simetrik ve MAC. Belirli algoritmaların desteği Keymaster HAL sürümüne bağlıdır.
RSA (1024–4096 bit) — imzalama (PKCS1, PSS) ve şifreleme (OAEP, PKCS1) için. EC (P-224, P-256, P-384, P-521) — ECDSA imzalama ve ECDH anahtar anlaşması için. AES (128, 256 bit) — CBC, CTR, GCM modlarında simetrik şifreleme için. HMAC (SHA1, SHA256, SHA512) — mesaj kimlik doğrulaması için.
Her anahtar için, olası işlemleri kısıtlamak için setPurposes belirtilir. PURPOSE_SIGN ile bir RSA anahtarı, bir saldırganın API erişimi olsa bile şifreleme için kullanılamaz. Bu, donanım düzeyinde anahtar kullanımının zorunlu kılınmasıdır.
Keymaster, başarısız biyometrik kimlik doğrulama girişimlerinin bir sayacını içerir. Belirtilen sayıda başarısızlıktan sonra (setInvalidatedByBiometricEnrollment aracılığıyla yapılandırılabilir), anahtar kullanılamaz hale gelir ve silme/yeniden oluşturma gerektirir. Tüm biyometrik şablonlar kaldırıldığında, userAuthenticationRequired=true olan tüm anahtarlar otomatik olarak geçersiz kılınır.
Key Attestation (Android 8.1+) da desteklenir: uygulamanın isteği üzerine Keymaster, anahtarın özellikleri (donanım/yazılım, algoritma, amaçlar) hakkında bilgi içeren bir sertifikayı imzalar. Sunucu, anahtarın güvenilir bir ortamda oluşturulduğunu onaylamak için bu sertifikayı doğrulayabilir.
Sıkça Sorulan Sorular
Java KeyStore anahtarları parola korumalı bir dosyada (JKS, BKS) saklar. Android Keystore, TEE veya Secure Element aracılığıyla donanım izolasyonu kullanır. Java KeyStore root erişimine karşı savunmasızdır; Android Keystore değildir, çünkü özel anahtarlar güvenli ortamı asla terk etmez.
Evet, KeyProtection ile KeyStore.setEntry aracılığıyla. Ancak, içe aktarılan anahtar donanım korumasına sahip olmayacak — bir ana anahtarla şifrelenmiş yazılım Keystore'unda saklanacaktır. Maksimum güvenlik için anahtarları her zaman Keystore içinde oluşturun.
KeyChain.isBoundKeyAlgorithm kullanın veya anahtar oluşturma sonrası KeyCharacteristics'ı kontrol edin. Özelliklerde FLAG_HARDWARE bulunması, anahtarın TEE'de oluşturulduğu anlamına gelir. Ayrıca android.security.keystore.isHardwareBacked()'i de kontrol edebilirsiniz.
Uygulama kaldırıldığında, Android tüm anahtarlarını Keystore'dan siler. Veriler geri döndürülemez şekilde kaybolur. Yeniden yüklemede, uygulamanın yeni anahtarlar oluşturması gerekir. TEE aracılığıyla anahtar yedeklemesi mimari nedenlerle imkansızdır.
Kilitli bir cihazda Keymaster hiçbir işlem gerçekleştirmez. userAuthenticationRequired=true olan anahtarlar her seferinde biyometrik onay gerektirir. Root erişimi olsa bile, bir saldırgan Keymaster'ı doğrudan çağıramaz — yalnızca Android Keystore hizmeti aracılığıyla.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun