Android Keystore — şifreleme anahtarlarını izole edilmiş yürütme ortamında (TEE) oluşturan ve depolayan, işletim sisteminin bile erişemeyeceği bir kriptografik sağlayıcıdır. AOSP Security Documentation (2025)’a göre, Google Play’deki ilk 100 Android uygulamasının %80’inden fazlası token koruması ve veri şifreleme için Keystore kullanıyor. Android Keystore’u anlamak, Android’de güvenli anahtar depolama için kritik öneme sahiptir.
Anahtar Noktalar
Android Keystore — Android platformunun korumalı ortamda kriptografik anahtarları oluşturmak, depolamak ve kullanmak için API sağlayan sistem bileşenidir. Yazılım kriptografi kitaplıklarının (Bouncy Castle, Conscrypt) aksine, Keystore özel anahtarların asla izole yürütme alanını terk etmemesini garanti eder.
Keystore, Android 4.3’te (API 18) RSA desteğiyle bir yazılım sağlayıcısı olarak ortaya çıktı. Android 6.0 (API 23)’dan itibaren Keystore, Keymaster Hardware Abstraction Layer (HAL) aracılığıyla donanım desteği aldı ve uyumlu cihazlarda kriptografik işlemleri Trusted Execution Environment (TEE)’e devretti. Android Compatibility Definition Document (2025)’a göre, Android 9+ olan tüm cihazlar TEE veya StrongBox aracılığıyla donanım Keystore’unu desteklemek zorundadır.
Keystore’daki anahtarlar takma ad (alias) ile tanımlanır — anahtar oluşturulurken veya yüklenirken iletilen bir dize. Keystore, anahtarın ham malzemesini almayı izin vermez: Keystore’da oluşturulan anahtarlar için getEncoded() yöntemi null döndürür. Bu, yazılım anahtarlarından temel farktır — saldırgan, cihaz üzerinde tam kontrole sahip olsa bile özel anahtarı çıkaramaz.
Keystore, Android’in diğer güvenlik mekanizmalarıyla entegredir: biyometrik kimlik doğrulama (BiometricPrompt), dosya düzeyinde şifreleme (File-Based Encryption) ve SafetyNet/Play Integrity doğrulama işlevleri. Anahtarlar, belirli koşullarda otomatik silme için yapılandırılabilir: parola kaldırıldığında, yeni parmak izi eklendiğinde veya süresi dolduğunda.
Android Keystore mimarisi, donanım koruma derecesine göre farklılık gösteren üç uygulama seviyesi içerir. Seviye, cihazın donanım yeteneklerine bağlıdır.
TEE (Trusted Execution Environment) — ana işletim sistemiyle aynı işlemcide paralel çalışan izole bir alandır. TEE, işlemcinin fiziksel çekirdeğini iki sanal alana ayıran ARM TrustZone teknolojisini kullanır: Normal World (Android) ve Secure World (TEE). Secure World’deki kod, Normal World’den erişilemeyen belleğe ve çevre birimlerine erişebilir.
Uygulama Keystore aracılığıyla kriptografik bir işlem çağırdığında, istek Keymaster HAL üzerinden TEE’ye gönderilir ve işlem donanım tarafından yürütülür. Sonuç uygulamaya döndürülür, ancak özel anahtar TEE’nin korumalı belleğinde kalır. TEE, GlobalPlatform TEE Protection Profile’a uygun olarak sertifikalandırılmıştır ve TrustZone destekli işlemcilere sahip Android 9+ cihazlar için zorunlu bir gerekliliktir.
TEE, AES/GCM (128, 256 bit), RSA (2048, 4096 bit), EC (P-256, P-384, P-521) ve HMAC-SHA256 algoritmalarını destekler. TEE’nin performansı yazılım kriptografisinden daha düşüktür (%20–40 daha düşük), ancak tipik işlemler için (JWT imzalama, oturum anahtarı şifre çözme) gecikme 10–50 ms’yi aşmaz.
StrongBox — ana işlemciden fiziksel olarak ayrılmış özel bir güvenlik çipidir. İşlemci zamanını Android’le paylaşan TEE’nin aksine, StrongBox’un kendi CPU’su, RAM’i, True Random Number Generator (TRNG)’ı ve korumalı deposu (One-Time Programmable memory) vardır. StrongBox, Common Criteria EAL 4+ ve Secure IC Protection Profile’da sertifikalıdır.
StrongBox, ilgili çip mevcut olduğunda Android 9+ cihazlarda kullanılabilir (örn. Google Pixel’de Titan M, Samsung Galaxy’de Knox). Geliştirici, KeyGenParameterSpec’te setIsStrongBoxBacked(true) flagı ile StrongBox’u etkinleştirir. Donanım desteği yoksa flag göz ardı edilir ve Keystore TEE’ye geçer.
StrongBox sınırlamaları: sınırlı algoritma setini (AES-256, EC P-256, HMAC-SHA256) destekler, işlem kuyruğu — aynı anda en fazla bir, işlem sayısı — çip kaynaklarıyla sınırlıdır. StrongBox yüksek yüklü senaryolar için tasarlanmamıştır — sık işlemler için TEE kullanın ve StrongBox’u yalnızca kritik anahtarlar için (şifreleme anahtarı, imzalama anahtarı) kullanın.
Yazılım tabanlı Keystore — TEE veya StrongBox donanım desteği olmayan cihazlarda kullanılan yazılım uygulamasıdır. Anahtarlar dosya sisteminde şifrelenmiş olarak depolanır, ancak özel anahtar geçici olarak RAM’de şifresi çözülebilir. Yazılım Keystore daha az güvenlidir — root erişimi olan bir saldırgan bellekteki anahtarı ele geçirebilir.
Android 12 (API 31)’den itibaren Google, tüm yeni cihazlar için donanım Keystore desteğini zorunlu kılar. Android 9–11 olan cihazlarda bütçe modellerinde yazılım Keystore bulunabilir. Geliştirici, KeyStore.getKeyCharacteristics() ile koruma seviyesini kontrol edebilir — SECURITY_LEVEL_TRUSTED_ENVIRONMENT veya SECURITY_LEVEL_STRONGBOX özelliği donanım korumasını onaylar.
Android Keystore, anahtar türüne göre kategorilere ayrılmış geniş bir kriptografik algoritma kümesini destekler. Algoritma seçimi performansı, uyumluluğu ve güvenlik seviyesini etkiler.
AES (Advanced Encryption Standard) — cihazda veri koruması için simetrik şifreleme. Önerilen mod: AES/GCM/NoPadding (256 bit). GCM, doğrulanmış şifreleme (AEAD) sağlar — şifrelenmiş verilerin bütünlüğünü kontrol eder. GCM için IV (Initialization Vector) boyutu: 12 bayt. AES/ECB kullanmayın — uygun koruma sağlamaz.
RSA (Rivest–Shamir–Adleman) — oturum anahtarı koruması ve dijital imza için asimetrik şifreleme. Önerilen boyut: 2048 veya 4096 bit. Modlar: RSA/ECB/PKCS1Padding (şifreleme) ve RSA/ECB/PKCS1Sign (imza). RSA 1024 eski kabul edilir ve yeni uygulamalar için önerilmez (NIST SP 800-131A Rev. 2).
EC (Elliptic Curve) — imza ve anahtar değişimi için eliptik eğri kriptografisi. Desteklenen eğriler: secp256r1 (P-256, zorunlu), secp384r1 (P-384) ve secp521r1 (P-521). EC, önemli ölçüde daha küçük anahtar boyutunda RSA ile eşdeğer güvenlik sağlar. P-256 çoğu senaryo için önerilir: tüm cihazlarda desteklenir ve 128 bit güvenlik seviyesi sağlar.
HMAC (Hash-based Message Authentication Code) — mesajların simetrik kimlik doğrulaması. Desteklenen hash fonksiyonları: SHA-256, SHA-384, SHA-512. HMAC, veri bütünlüğü ve gerçekliğini doğrulamak için kullanılır, örneğin webhook isteklerini doğrulama veya yapılandırma bütünlüğünü kontrol etme.
Tüm algoritmalar, KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true) aracılığıyla biyometrik kimlik doğrulamaya bağlanabilir. Android 11+’da, biyometrik kimlik doğrulamadan sonra anahtarın yeniden istemeden kullanılabileceği zaman aşımını (saniye cinsinden) belirten setUserAuthenticationParameters() flagı mevcuttur.
Android Keystore ile Kotlin’de pratik örnekleri inceleyelim: AES anahtarı oluşturma, veri şifreleme ve imza için asimetrik çift oluşturma.
Örnek, biyometrik kimlik doğrulamaya bağlı 256 bit AES/GCM anahtarı oluşturur. Anahtar getEncoded() ile dışa aktarılamaz.
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()
}
Örnek, Android Keystore’dan bir anahtar kullanarak veriyi şifreler. Cipher takma adla anahtarı alır, AES/GCM şifrelemesini başlatır ve IV ile birlikte şifrelenmiş veriyi döndürü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 + şifrelenmiş veriler
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)
}
Örnek, StrongBox’a bağlı RSA-2048 anahtar çiftini Keystore’da oluşturur. Özel anahtar imza için kullanılır, genel anahtar getEncoded() ile dışa aktarılabilir.
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()
// Genel anahtar dışa aktarılabilir
val publicKey = pair.public // X509EncodedKeySpec
}
Android Keystore’un etkili kullanımı, performansı korurken maksimum korumayı sağlayan kurallara uymayı gerektirir.
KeyGenParameterSpec’i minimum gerekli parametrelerle kullanın: yalnızca gerçekten kullanılan purpose, block modes ve paddings’i belirtin. Gereksiz parametreler (örn. yalnızca imza için kullanılan bir anahtar için PURPOSE_ENCRYPT) gereksiz saldırı vektörleri oluşturur. Android, imza için özetin (digest) açıkça belirtilmesini önerir — SHA256 minimum kabul edilebilir seviyedir (SHA1 eski).
Kritik işlemler için anahtarları biyometriye bağlayın: setUserAuthenticationRequired(true), anahtarın yalnızca biyometrik kimlik doğrulamadan sonra kullanılabileceğini garanti eder. Android 11+’da, aynı oturumda her işlem için biyometri istememek üzere zaman aşımı (önerilen 30–60 saniye) ile setUserAuthenticationParameters() kullanın. setInvalidatedByBiometricEnrollment(true), yeni parmak izi veya yüz eklendiğinde anahtarı otomatik olarak geçersiz kılar — eski biyometrik verilerle erişimi önler.
Başlatma aşamasında güvenlik seviyesini kontrol edin: SECURITY_LEVEL’ü belirlemek için KeyStore.getKeyCharacteristics() kullanın. Cihaz yalnızca yazılım Keystore’u (SECURITY_LEVEL_SOFTWARE) destekliyorsa, işlevselliği reddetme veya ek şifreleme (örn. kullanıcı şifresiyle anahtar sarma) kullanma kararı verin. StrongBox garanti edilmiyorsa ona güvenmeyin — her zaman setIsStrongBoxBacked(true) flagını belirtin ve getKeyCharacteristics ile sonucu kontrol edin.
Anahtarları programa göre güncelleyin: kriptografik anahtarların önerilen bir ömrü vardır. NIST SP 800-57, AES anahtarlarının her 1–2 yılda, RSA/EC çiftlerinin her 2–3 yılda değiştirilmesini önerir. Anahtar dönüşüm mekanizması uygulayın: uygulama başlatılırken anahtar oluşturma tarihini (KeyGenParameterSpec.Builder.setKeyValidityStart/End) kontrol edin ve süresi dolduğunda yeni bir anahtar oluşturun. Eski anahtarla şifrelenmiş eski veriler çözülmeli ve yenisiyle yeniden şifrelenmelidir.
Büyük veriler için Keystore kullanmayın: Keystore anahtar depolama (birkaç yüz bayt) içindir, büyük dosyaları şifrelemek için değil. Veri şifreleme için şemasını kullanın: rastgele bir AES anahtarı (DEK — Data Encryption Key) oluşturun, veriyi bu anahtarla şifreleyin ve DEK’i Keystore anahtarıyla (KEK — Key Encryption Key) şifreleyin. Android EncryptedSharedPreferences tam olarak bu şemayı kullanır: ana anahtar Keystore’da, veriler — AES-256 GCM.
Sıkça Sorulan Sorular
Hayır, Android Keystore, özel anahtarın asla TEE veya StrongBox’tan ayrılmaması için tasarlanmıştır. Keystore’da oluşturulan anahtarlar için getEncoded() null döndürür. Anahtar yalnızca Cipher, Signature veya Mac API aracılığıyla kullanılabilir — ham malzeme mevcut değildir.
TEE (TrustZone) — aynı işlemcide sanal yalıtım, zaman bölüşümü kullanır. StrongBox — kendi CPU ve belleğine sahip ayrı çip. StrongBox daha güvenlidir (Common Criteria EAL 4+), ancak daha yavaştır ve daha az algoritma destekler. TEE sık işlemler için uygundur, StrongBox kritik anahtarlar içindir.
setIsStrongBoxBacked(true) flagı ile anahtar oluşturduktan sonra KeyStore.getKeyCharacteristics() kullanın. SECURITY_LEVEL_STRONGBOX özelliği donanım desteğini onaylar. Cihaz StrongBox’u desteklemiyorsa, Keystore hata vermeden TEE’ye geçer — güvenlik seviyesini açıkça kontrol etmek gerekir.
Keystore’daki anahtarlar, uygulama cihazdan kaldırıldığında otomatik olarak silinir. Android 10+’da, uygulamanın manifestinde allowBackup=true flagı varsa anahtarlar korunabilir, ancak yeniden yüklemeden sonra kullanılamaz olurlar. Temiz kurulumda anahtarların yeniden oluşturulması önerilir.
Hayır, Android Keystore belirli bir cihazın donanımına bağlıdır. Bir cihazın TEE’sinde oluşturulan anahtar başka bir cihaza aktarılamaz. Platformlar arası şifreleme için şemayı kullanın: Keystore cihazdaki anahtarı korur ve oturum anahtarları asimetrik şifreleme kullanan güvenli API üzerinden iletilir.
Ö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