KeyStore (Android), donanım yalıtımı özellikleriyle güvenli anahtar depolama için Android'e entegre edilmiş Java Cryptography Architecture (JCA) kriptografik sağlayıcısının bir uygulamasıdır. Android 4.3'ten (API 18) itibaren KeyStore, Keymaster HAL aracılığıyla donanım anahtarlarını destekler ve Android 9'dan (API 28) itibaren özel bir Secure Element'teki anahtarlar için StrongBox Keymaster'ı destekler. Android Güvenlik Dokümantasyonu'na göre, “AndroidKeyStore” sağlayıcısı standart Bouncy Castle veya OpenSSL KeyStore'un yerini alarak yetkisiz anahtar çıkarmaya karşı sistem düzeyinde koruma sağlar.
Önemli Noktalar
Android'de KeyStore ayrı bir uygulama veya dosya değil, java.security.KeyStore arayüzünü uygulayan bir kriptografik sağlayıcıdır. Özel anahtarları, simetrik anahtarları ve güvenilir CA sertifikalarını depolamak ve kullanmak için birleşik bir API sağlar. Sağlayıcı “AndroidKeyStore” adı altında kayıtlıdır ve standart KeyStore.getInstance() aracılığıyla erişilebilir.
Android 4.3'ten önce, kriptografik işlemler Bouncy Castle aracılığıyla gerçekleştiriliyordu. Android 4.3, ARM TrustZone'da TEE kullanımını sağlayan Keymaster HAL 1.0'ı tanıttı. Android 6.0 (API 23), donanım destekli parmak izi kimlik doğrulamasıyla Keymaster 2.0'ı ekledi. Android 9 (API 28), özel bir Secure Element için Keymaster 4.0 ve StrongBox Keymaster'ı tanıttı.
Keymaster'ın her sürümü yeni yetenekler ekler ve anahtar yalıtımını iyileştirir. Modern cihazlar (2022+), Google Mobile Services sertifikası için Keymaster 4.0'ı desteklemelidir ve bu da tüm Android uygulamaları için TEE kullanılabilirliğini garanti eder.
Android KeyStore üç katmandan oluşur: Java API (KeyStore, KeyPairGenerator), sistem süreci keystore (C++, sistem hizmeti olarak çalışır) ve Keymaster HAL (TEE veya Secure Element'teki kitaplık). Uygulama API'yi çağırır, keystore hizmeti isteği Keymaster'a yönlendirir ve işlem güvenli ortamda yürütülür.
Tüm özel anahtarlar TEE'de saklanır ve kullanıcı alanından okunamaz. Sistem keystore hizmetinin bile ham anahtarlara erişimi yoktur — yalnızca Keymaster içindeki anahtarları işaret eden tanıtıcılara erişimi vardır.
Android KeyStore, standart JCA hizmet sağlayıcı arayüzünü uygular. Bir uygulama Cipher.getInstance(“RSA/ECB/PKCS1Padding”, “AndroidKeyStore”) çağrısı yaptığında, Android Güvenlik Sağlayıcısı işlemi zincir aracılığıyla Keymaster'a devreder: Java → JNI → keystore hizmeti → Keymaster HAL.
AndroidKeyStore sağlayıcısı, süreç başladığında otomatik olarak kaydedilir. Önceliği Bouncy Castle veya Conscrypt'ten daha yüksektir. Bu nedenle, bir sağlayıcı belirtmeden KeyStore.getInstance() çağrıldığında çoğu durumda AndroidKeyStore döndürülür. Açık çağrı için KeyStore.getInstance(“AndroidKeyStore”) kullanın.
Her Android uygulamasının KeyStore'da yalıtılmış bir kapsayıcısı vardır. Aynı UID'ye (shared userId) sahip uygulamalar belirli anahtarlara paylaşımlı erişime sahip olabilir, ancak standart kurulum, A uygulamasının B uygulamasının anahtarlarını okuyamayacağını garanti eder.
load(null) — KeyStore başlatma. AndroidKeyStore için parametre her zaman null'dur. setEntry — belirtilen KeyProtection (amaçlar, digest, padding) ile bir anahtarı kaydeder. getEntry — KeyStore.PrivateKeyEntry, SecretKeyEntry veya TrustedCertificateEntry alır. containsAlias — bir anahtarın var olup olmadığını kontrol eder. deleteEntry — bir anahtarı kalıcı olarak siler.
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, cihazdaki Keymaster HAL sürümüne bağlı olarak değişen geniş bir kriptografik algoritma kümesini destekler. Bir geliştirici, oluşturma girişimi sırasında KeyGenParameterSpec.Builder aracılığıyla desteklenen algoritmaların listesini alabilir — uyumsuz parametreler InvalidAlgorithmParameterException fırlatır.
RSA (1024–4096 bit) — imzalama (SHA-1/SHA-256/SHA-384/SHA-512 ile PKCS1, PSS) ve şifreleme (SHA-1/SHA-256 ile OAEP) için. EC (P-224, P-256, P-384, P-521) — ECDSA imzalama ve ECDH anahtar anlaşması için. X25519 ve Ed25519 — Android 12'den (API 31) itibaren modern kriptografik protokoller için.
Asimetrik anahtarlar için her zaman Keymaster içinde oluşturun, özel anahtarları ASLA içe aktarmayın. İçe aktarılan özel anahtarlar donanım tarafından korunmaz — yazılım katmanında saklanır ve uygulama süreci tehlikeye girerse savunmasız kalır.
AES (128, 256 bit) — CBC, CTR, GCM modlarında simetrik şifreleme için. HMAC (SHA-1, SHA-256, SHA-512) — mesaj kimlik doğrulaması için. ChaCha20 (Android 12+) — Poly1305 kimlik doğrulamasıyla yüksek performanslı akış şifrelemesi için.
| Algoritma | Keymaster | Amaç | API |
|---|---|---|---|
| RSA | KM 1.0+ | İmzalama, Şifreleme | 18+ |
| EC | KM 1.0+ | ECDSA, ECDH | 18+ |
| AES | KM 2.0+ | Simetrik şifreleme | 23+ |
| HMAC | KM 2.0+ | Kimlik doğrulama kodu | 23+ |
| ChaCha20 | KM 3.0+ | Akış şifreleme | 31+ |
| X25519/Ed25519 | KM 3.0+ | Anahtar değişimi | 31+ |
KeyStore.PrivateKeyEntry — özel bir anahtar (dışa aktarılamaz) ve bir sertifika zinciri içerir. KeyStore.SecretKeyEntry — simetrik anahtarlar için. KeyStore.TrustedCertificateEntry — güvenilir CA sertifikaları için. Genel anahtarlar keyStore.getCertificate(alias).publicKey aracılığıyla dışa aktarılabilir.
Tam bir senaryoyu inceleyelim: veri şifreleme için bir AES anahtarı oluşturma ve biyometrik korumayla imzalama için bir EC anahtarı oluşturma. Her iki anahtar da donanım desteğiyle Android KeyStore içinde oluşturulur.
Bir AES anahtarı, KeyGenParameterSpec ile KeyGenerator aracılığıyla oluşturulur. Parametreler: PURPOSE_ENCRYPT + PURPOSE_DECRYPT, BLOCK_MODE_GCM (kimlik doğrulamalı önerilen mod), ENCRYPTION_PADDING_NONE (GCM için padding gerekmez).
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)
}
userAuthenticationRequired=true olan bir EC anahtarı, her imzalama işleminden önce kullanıcı kimlik doğrulaması gerektirir. Bunun için Signature nesnesini içeren CryptoObject ile BiometricPrompt kullanılır. Başarılı biyometrik doğrulamadan sonra Keymaster işleme izin 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, yazılım tabanlı KeyStore'ların (JKS, BKS) sunamayacağı donanım düzeyinde güvenlik garantileri sağlar. Anahtarlar SoC düzeyinde korunur ve Android kullanıcı alanı üzerinde tam kontrol bile özel anahtarın çıkarılmasına izin vermez.
Key Attestation, bir uygulamanın (ve sunucunun) bir anahtarın hangi ortamda oluşturulduğunu doğrulamasını sağlayan bir mekanizmadır. Android Keystore, anahtar özelliklerinin bir listesini içeren bir sertifikayı imzalar: algoritma, boyut, amaçlar, donanım destekli (True/False), kaynak (GENERATED, IMPORTED). Sunucu, sertifika zincirini Google kök sertifikasına kadar doğrular.
Bu, finansal uygulamalar için kritiktir: sunucu, anahtarın bir donanım ortamında oluşturulmasını talep edebilir (Hardware-Backed = True) ve yazılım Keystore'da oluşturulan anahtarları reddedebilir. Key Attestation, saldırganın Keystore'u bir emülatörle değiştirdiği saldırıları önler.
setInvalidatedByBiometricEnrollment(true), biyometrik şablonlar değiştirildiğinde veya kaldırıldığında Keymaster'ın anahtarı otomatik olarak sileceği anlamına gelir. Bu, bir saldırganın mevcut bir hesaba kendi parmak izini eklediği saldırılara karşı koruma sağlar. Yeni bir parmak izi eklendikten sonra eski anahtarlara erişilemez hale gelir.
Başarısız biyometrik kimlik doğrulama girişimlerinin sayacı da Keymaster tarafından yönetilir. maxBiometricAttempt'ten sonra (üretici tarafından yapılandırılabilir, genellikle 5), Keymaster biyometrik anahtarlarla tüm işlemleri 30 saniye boyunca engeller. 10 başarısız girişimden sonra — cihaz şifresi (gizli PIN) girilene kadar.
Sıkça Sorulan Sorular
Bouncy Castle (BKS), anahtarları parola korumalı bir dosyada saklayan yazılım tabanlı bir KeyStore'dur. Android KeyStore, donanım yalıtımı TEE/StrongBox kullanır. BKS anahtarları root erişimiyle çıkarılabilir, Android KeyStore anahtarları çıkarılamaz. BKS, CA sertifikaları için uygundur, Android KeyStore özel anahtarlar içindir.
Evet, oluşturma sırasında PURPOSE_ENCRYPT veya PURPOSE_DECRYPT veya PURPOSE_SIGN veya PURPOSE_VERIFY belirtirseniz mümkündür. Ancak en iyi uygulama, farklı işlemler için ayrı anahtarlar oluşturmaktır. Bu, bir anahtar tehlikeye girerse hasarı sınırlar ve en az ayrıcalık ilkesini izler.
android.security.keystore aracılığıyla kullanılabilen KeyStore.getKeyCharacteristics(alias) kullanın. Yöntem bir dizi bayrak döndürür: FLAG_HARDWARE — TEE'de anahtar, FLAG_SECURE_ELEMENT — StrongBox'ta anahtar. Bayrak yoksa anahtar yalnızca yazılımdır.
setInvalidatedByBiometricEnrollment(true) ile oluşturulan tüm anahtarlar Keymaster tarafından otomatik olarak geçersiz kılınır. Kullanmaya çalışıldığında uygulama KeyPermanentlyInvalidatedException alır. Bu anahtarlarla şifrelenmiş veriler kalıcı olarak kaybolur.
Donanım anahtarları (TEE/StrongBox'ta) yedeklemeyi desteklemez — belirli bir cihaza bağlıdırlar. Yazılım tabanlı anahtarlar Google Drive yedeklemesine dahil edilebilir. Cihazlar arasında veri aktarmak için sunucuda verileri şifreleyin ve yeni cihazda şifreyi çözün.
Ö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