KeyStore (Android): konsep kunci, API dan cara kerja penyimpanan kriptografi

Penulis: IT Sectr Diterbitkan: 2026-03-14 Waktu membaca: 10 mnt

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

  • Android KeyStore — penyedia JCA untuk penyimpanan kunci dengan dukungan TEE, StrongBox dan perlindungan biometrik
  • KeyGenParameterSpec menentukan algoritma, tujuan, digest, padding dan biometrik saat pembuatan kunci
  • Keymaster HAL melakukan operasi kriptografi perangkat keras pada tingkat Software, TEE dan StrongBox
  • Key Attestation (API 28+) memungkinkan server memverifikasi bahwa kunci dibuat di lingkungan perangkat keras Android KeyStore
  • Alias kunci — string yang digunakan aplikasi untuk mengakses kunci di Keystore; satu alias sesuai dengan satu kunci

Apa itu KeyStore di Android?

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.

Evolusi Android KeyStore

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.

Arsitektur dan komponen

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.

Bagaimana KeyStore bekerja sebagai penyedia kriptografi?

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.

Pendaftaran penyedia

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.

Metode KeyStore dan karakteristiknya

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

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

Algoritma dan jenis kunci yang didukung

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.

Algoritma asimetris

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.

Algoritma simetris

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.

AlgoritmaKeymasterTujuanAPI
RSAKM 1.0+Tanda tangan, enkripsi18+
ECKM 1.0+ECDSA, ECDH18+
AESKM 2.0+Enkripsi simetris23+
HMACKM 2.0+Kode autentikasi23+
ChaCha20KM 3.0+Enkripsi aliran31+
X25519/E25519KM 3.0+Pertukaran kunci31+

Jenis kunci dan serialisasinya

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.

Contoh pembuatan dan penggunaan kunci

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.

Pembuatan kunci AES untuk enkripsi

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

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

Tanda tangan dengan perlindungan biometrik

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.

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

KeyStore dan keamanan pada perangkat

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 (Android 8.1+)

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.

Invalidasi kunci saat perubahan biometrik

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

Apa perbedaan antara Android KeyStore dan Bouncy Castle KeyStore?

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.

Bisakah satu kunci digunakan untuk enkripsi dan tanda tangan?

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.

Bagaimana cara mengetahui apakah kunci di Android KeyStore bersifat perangkat keras?

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.

Apa yang terjadi jika semua templat biometrik dihapus?

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.

Apakah Android KeyStore mendukung pencadangan kunci?

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

  • Android KeyStore — penyedia JCA untuk penyimpanan kunci terisolasi perangkat keras melalui Keymaster HAL di TEE/StrongBox
  • KeyGenParameterSpec mengkonfigurasi algoritma, ukuran, purges, digest, biometrik dan batasan waktu kunci
  • RSA (KM 1.0+), EC (KM 1.0+), AES (KM 2.0+), ChaCha20 (KM 3.0+) — algoritma yang didukung dengan berbagai tingkat Keymaster
  • Key Attestation (API 28+) memungkinkan sisi server memverifikasi asal perangkat keras kunci
  • Perlindungan biometrik kunci melalui setUserAuthenticationRequired + BiometricPrompt dengan CryptoObject
  • Invalidasi kunci saat perubahan biometrik mencegah penggunaan tidak sah dari sidik jari yang ditambahkan
  • Gunakan Android KeyStore untuk pembuatan dan penyimpanan kunci kriptografi dengan perlindungan perangkat keras di aplikasi Android

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.

Diskusikan proyek

Baca juga