KeyStore (Android) — adalah implementasi penyedia kriptografi Java Cryptography Architecture (JCA) yang terintegrasi ke dalam Android untuk penyimpanan kunci yang aman dengan kemampuan isolasi perangkat keras. Sejak Android 4.3 (API 18) KeyStore mendukung kunci perangkat keras melalui Keymaster HAL, dan mulai Android 9 (API 28) — StrongBox Keymaster untuk kunci di Secure Element khusus. Menurut Android Security Documentation, penyedia “AndroidKeyStore” menggantikan Bouncy Castle atau OpenSSL KeyStore standar, memberikan perlindungan sistem terhadap ekstraksi kunci yang tidak sah.
Poin Utama
KeyStore di Android — bukan aplikasi atau file terpisah, melainkan penyedia kriptografi yang mengimplementasikan antarmuka java.security.KeyStore. Ini menyediakan API terpadu untuk menyimpan dan menggunakan kunci privat, kunci simetris dan sertifikat otoritas tepercaya (CA). Penyedia terdaftar dengan nama “AndroidKeyStore” dan dapat diakses melalui KeyStore.getInstance() standar.
Sebelum Android 4.3, operasi kriptografi dilakukan secara perangkat lunak melalui Bouncy Castle. Dengan Android 4.3 muncullah Keymaster HAL 1.0 yang memungkinkan penggunaan TEE pada ARM TrustZone. Android 6.0 (API 23) menambahkan Keymaster 2.0 dengan dukungan autentikasi perangkat keras melalui sidik jari. Android 9 (API 28) memperkenalkan Keymaster 4.0 dan StrongBox Keymaster untuk Secure Element khusus.
Setiap versi Keymaster menambahkan kemampuan baru dan meningkatkan isolasi kunci. Perangkat modern (2022+) harus mendukung Keymaster 4.0 untuk sertifikasi Google Mobile Services, yang menjamin keberadaan TEE untuk semua aplikasi Android.
Android KeyStore terdiri dari tiga tingkat: Java API (KeyStore, KeyPairGenerator), proses sistem keystore (C++, berfungsi sebagai system service) dan Keymaster HAL (pustaka di TEE atau Secure Element). Aplikasi memanggil API, layanan keystore mengarahkan permintaan ke Keymaster, operasi dilakukan di lingkungan yang dilindungi.
Semua kunci privat disimpan di TEE dan tidak dapat dibaca dari ruang pengguna. Bahkan layanan sistem keystore tidak memiliki akses ke kunci mentah — hanya ke handle yang menunjuk ke kunci di dalam Keymaster.
Android KeyStore mengimplementasikan antarmuka standar penyedia layanan JCA. Ketika aplikasi memanggil Cipher.getInstance(“RSA/ECB/PKCS1Padding”, “AndroidKeyStore”), Android Security Provider mendelegasikan operasi ke Keymaster melalui rantai: Java → JNI → keystore service → Keymaster HAL.
Penyedia AndroidKeyStore terdaftar secara otomatis saat proses dimulai. Prioritasnya lebih tinggi dari Bouncy Castle atau Conscrypt. Oleh karena itu, saat memanggil KeyStore.getInstance() tanpa menentukan penyedia, dalam banyak kasus AndroidKeyStore dikembalikan. Untuk panggilan eksplisit, gunakan KeyStore.getInstance(“AndroidKeyStore”).
Setiap aplikasi Android memiliki kontainer terisolasi di KeyStore. Aplikasi dengan UID yang sama (shared userId) dapat memiliki akses bersama ke kunci tertentu, tetapi konfigurasi standar menjamin bahwa aplikasi A tidak dapat membaca kunci aplikasi B.
load(null) — inisialisasi KeyStore. Parameter selalu null untuk AndroidKeyStore. setEntry — menyimpan kunci dengan menentukan KeyProtection (purposes, digest, padding). getEntry — mendapatkan KeyStore.PrivateKeyEntry, SecretKeyEntry atau TrustedCertificateEntry. containsAlias — memeriksa keberadaan kunci. deleteEntry — menghapus kunci (tidak dapat dibatalkan).
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 mendukung berbagai algoritma kriptografi yang bervariasi tergantung pada versi Keymaster HAL di perangkat. Pengembang dapat memperoleh daftar algoritma yang didukung melalui KeyGenParameterSpec.Builder saat percobaan pembuatan — parameter yang tidak kompatibel menyebabkan InvalidAlgorithmParameterException.
RSA (1024–4096 bit) — untuk tanda tangan (PKCS1, PSS dengan SHA-1/SHA-256/SHA-384/SHA-512) dan enkripsi (OAEP dengan SHA-1/SHA-256). EC (P-224, P-256, P-384, P-521) — untuk tanda tangan ECDSA dan kesepakatan kunci ECDH. X25519 dan Ed25519 — dari Android 12 (API 31) untuk protokol kriptografi modern.
Untuk kunci asimetris Selalu hasilkan di dalam Keymaster, JANGAN PERNAH impor kunci privat. Kunci privat yang diimpor tidak dilindungi perangkat keras — disimpan di lapisan perangkat lunak dan rentan saat kompromi AP.
AES (128, 256 bit) — untuk enkripsi simetris dalam mode CBC, CTR, GCM. HMAC (SHA-1, SHA-256, SHA-512) — untuk autentikasi pesan. ChaCha20 (Android 12+) — untuk enkripsi aliran berkinerja tinggi dengan autentikasi Poly1305.
| Algoritma | Keymaster | Tujuan | API |
|---|---|---|---|
| RSA | KM 1.0+ | Tanda tangan, enkripsi | 18+ |
| EC | KM 1.0+ | ECDSA, ECDH | 18+ |
| AES | KM 2.0+ | Enkripsi simetris | 23+ |
| HMAC | KM 2.0+ | Kode autentikasi | 23+ |
| ChaCha20 | KM 3.0+ | Enkripsi aliran | 31+ |
| X25519/E25519 | KM 3.0+ | Pertukaran kunci | 31+ |
KeyStore.PrivateKeyEntry — berisi kunci privat (tidak dapat diekspor) dan rantai sertifikat. KeyStore.SecretKeyEntry — untuk kunci simetris. KeyStore.TrustedCertificateEntry — untuk sertifikat CA tepercaya. Kunci publik tersedia untuk ekspor melalui keyStore.getCertificate(alias).publicKey.
Mari kita lihat skenario lengkap: pembuatan kunci AES untuk enkripsi data dan pembuatan kunci EC untuk tanda tangan dengan perlindungan biometrik. Kedua kunci dibuat di dalam Android KeyStore dengan dukungan perangkat keras.
Kunci AES dibuat melalui KeyGenerator dengan KeyGenParameterSpec. Parameter: PURPOSE_ENCRYPT + PURPOSE_DECRYPT, BLOCK_MODE_GCM (mode yang direkomendasikan dengan autentikasi), ENCRYPTION_PADDING_NONE (untuk GCM padding tidak diperlukan).
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)
}
Kunci EC dengan userAuthenticationRequired=true memerlukan autentikasi pengguna sebelum setiap operasi tanda tangan. Untuk ini digunakan BiometricPrompt dengan CryptoObject yang berisi objek Signature. Setelah biometrik berhasil, Keymaster mengizinkan operasi.
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 memberikan jaminan keamanan perangkat keras yang tidak dapat diberikan oleh KeyStore perangkat lunak (JKS, BKS). Kunci dilindungi di tingkat SoC, dan bahkan kendali penuh atas ruang pengguna Android tidak memungkinkan ekstraksi kunci privat.
Key Attestation — mekanisme yang memungkinkan aplikasi (dan server) memverifikasi di lingkungan mana kunci dibuat. Android Keystore menandatangani sertifikat yang berisi daftar karakteristik kunci: algoritma, ukuran, purges, hardware-backed (True/False), origin (GENERATED, IMPORTED). Server memverifikasi rantai sertifikat hingga sertifikat root Google.
Ini sangat penting untuk aplikasi keuangan: server dapat mensyaratkan bahwa kunci dibuat di lingkungan perangkat keras (Hardware-Backed = True) dan menolak kunci yang dibuat di Keystore perangkat lunak. Key Attestation mencegah serangan di mana penyerang mengganti Keystore dengan emulator.
setInvalidatedByBiometricEnrollment(true) berarti kunci akan dihapus secara otomatis oleh Keymaster saat templat biometrik pengguna diubah atau dihapus. Ini adalah perlindungan terhadap serangan di mana penyerang menambahkan sidik jarinya sendiri ke akun yang ada. Setelah penambahan sidik jari baru, kunci lama menjadi tidak dapat diakses.
Penghitung upaya autentikasi biometrik yang gagal juga dikelola oleh Keymaster. Setelah maxBiometricAttempt (diatur oleh produsen, biasanya 5) Keymaster memblokir semua operasi dengan kunci biometrik selama 30 detik. Setelah 10 upaya gagal — hingga memasukkan kata sandi perangkat (PIN rahasia).
Pertanyaan Umum
Bouncy Castle (BKS) — KeyStore perangkat lunak yang menyimpan kunci dalam file yang dilindungi kata sandi. Android KeyStore menggunakan isolasi perangkat keras TEE/StrongBox. Kunci BKS dapat diekstraksi dengan akses root, kunci Android KeyStore tidak. BKS cocok untuk sertifikat CA, Android KeyStore untuk kunci privat.
Ya, jika saat pembuatan ditentukan PURPOSE_ENCRYPT or PURPOSE_DECRYPT or PURPOSE_SIGN or PURPOSE_VERIFY. Namun, praktik terbaik adalah membuat kunci terpisah untuk operasi yang berbeda. Ini membatasi kerusakan jika salah satu kunci dikompromikan dan sesuai dengan prinsip hak istimewa minimal.
Gunakan KeyStore.getKeyCharacteristics(alias), tersedia melalui android.security.keystore. Metode mengembalikan serangkaian flag: FLAG_HARDWARE — kunci di TEE, FLAG_SECURE_ELEMENT — kunci di StrongBox. Jika tidak ada flag — kunci bersifat perangkat lunak.
Semua kunci yang dibuat dengan setInvalidatedByBiometricEnrollment(true) akan secara otomatis dinvalidasi oleh Keymaster. Saat mencoba menggunakan, aplikasi akan menerima KeyPermanentlyInvalidatedException. Data yang dienkripsi dengan kunci ini akan hilang secara permanen.
Kunci perangkat keras (di TEE/StrongBox) tidak mendukung pencadangan — mereka terikat pada perangkat tertentu. Kunci perangkat lunak dapat disertakan dalam cadangan Google Drive. Untuk mentransfer data antar perangkat, enkripsi data di server dan dekripsi di perangkat baru.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga