Android’de Keystore — nedir, mimarisi ve kriptografi

Yazar: IT Sectr Yayınlanma: 2026-04-04 Okuma süresi: 9 dk

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 — donanımda izole edilmiş ortamda (TEE) kriptografik anahtarları oluşturmak ve depolamak için sistem sağlayıcısı.
  • StrongBox Keymaster — kendi CPU ve TRNG’sine sahip özel güvenlik çipi, Common Criteria EAL 4+ sertifikalı.
  • KeyGenParameterSpec — algoritma, anahtar boyutu, biyometrik bağlama ve son kullanma tarihini ayarlamak için yapılandırıcı.
  • TEE (Trusted Execution Environment) — kullanıcı alanından erişim olmadan kriptografik işlemlerin yürütüldüğü işlemcinin izole alanı.
  • Keystore’dan anahtarlar çıkarılamaz — özel anahtar asla TEE veya StrongBox’dan ayrılmaz, uygulama geliştiricisi bile okuyamaz.

Android’de Keystore Nedir?

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

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.

Donanım Destekli Keystore (TEE)

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 Keymaster

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

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.

Desteklenen Algoritmalar ve Fonksiyonlar

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.

Kod Örnekleri: Anahtar Oluşturma ve Kullanımı

Android Keystore ile Kotlin’de pratik örnekleri inceleyelim: AES anahtarı oluşturma, veri şifreleme ve imza için asimetrik çift oluşturma.

Keystore’da AES Anahtarı Oluşturma

Örnek, biyometrik kimlik doğrulamaya bağlı 256 bit AES/GCM anahtarı oluşturur. Anahtar getEncoded() ile dışa aktarılamaz.

kotlin
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()
}

AES/GCM Veri Şifreleme

Ö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.

kotlin
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)
}

İmza için RSA Çifti Oluşturma

Ö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.

kotlin
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 ile En İyi Uygulamalar

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

Android Keystore’dan özel anahtar alınabilir mi?

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 ve StrongBox arasındaki fark nedir?

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.

Cihazın StrongBox’u destekleyip desteklemediğini nasıl kontrol ederim?

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.

Uygulama silindiğinde anahtarlara ne olur?

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.

Bir anahtar birden fazla cihazda kullanılabilir mi?

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

  • Android Keystore — donanımda izole edilmiş ortamda (TEE veya StrongBox) kriptografik anahtarları koruyan sistem sağlayıcısı.
  • TEE (TrustZone) — aynı işlemcide sanal yalıtım, TrustZone’lu Android 9+ cihazlar için zorunlu.
  • StrongBox — Common Criteria EAL 4+ sertifikalı özel güvenlik çipi, setIsStrongBoxBacked(true) ile etkinleştirilir.
  • KeyGenParameterSpec — anahtar parametrelerini yapılandırmak için merkezi sınıf: algoritma, boyut, biyometrik bağlama ve dönüşüm.
  • Anahtarlar çıkarılamaz — özel malzeme getEncoded() ile mevcut değil, işlemler TEE/StrongBox içinde yürütülür.
  • Önerilen algoritmalar — şifreleme için AES/GCM/NoPadding (256 bit), imza için EC P-256, asimetrik senaryolar için RSA 2048.
  • KEK/DEK şeması — Keystore, veri şifreleme anahtarlarını koruyan ana anahtarı saklar, performans ve güvenlik sağlar.

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.

Projeyi tartış

Ayrıca okuyun