Keystore di Android — apa itu, arsitektur dan kriptografi

Penulis: IT Sectr Diterbitkan: 2026-04-04 Waktu membaca: 9 mnt

Android Keystore — penyedia kriptografis yang menghasilkan dan menyimpan kunci enkripsi di lingkungan eksekusi terisolasi (TEE), yang tidak dapat diakses bahkan oleh sistem operasi. Menurut AOSP Security Documentation (2025), Keystore digunakan di lebih dari 80% aplikasi Android dari top 100 Google Play untuk melindungi token dan mengenkripsi data. Memahami Android Keystore sangat penting untuk penyimpanan kunci yang aman di Android.

Poin Penting

  • Android Keystore — penyedia sistem untuk menghasilkan dan menyimpan kunci kriptografis di lingkungan terisolasi perangkat keras (TEE).
  • StrongBox Keymaster — chip keamanan khusus dengan CPU dan TRNG sendiri, bersertifikat Common Criteria EAL 4+.
  • KeyGenParameterSpec — konfigurator untuk mengatur algoritma, ukuran kunci, pengikatan biometrik, dan masa berlaku.
  • TEE (Trusted Execution Environment) — area prosesor terisolasi di mana operasi kriptografis dilakukan tanpa akses dari ruang pengguna.
  • Kunci dari Keystore tidak dapat diekstrak — kunci privat tidak pernah meninggalkan TEE atau StrongBox, bahkan pengembang aplikasi pun tidak dapat membacanya.

Apa itu Keystore di Android?

Android Keystore — komponen sistem platform Android yang menyediakan API untuk menghasilkan, menyimpan, dan menggunakan kunci kriptografis di lingkungan yang dilindungi. Tidak seperti pustaka kriptografis perangkat lunak (Bouncy Castle, Conscrypt), Keystore menjamin bahwa kunci privat tidak pernah meninggalkan area eksekusi terisolasi.

Keystore muncul di Android 4.3 (API 18) sebagai penyedia perangkat lunak dengan dukungan RSA. Mulai Android 6.0 (API 23), Keystore mendapat dukungan perangkat keras melalui Keymaster Hardware Abstraction Layer (HAL), yang mendelegasikan operasi kriptografis ke Trusted Execution Environment (TEE) pada perangkat yang kompatibel. Menurut Android Compatibility Definition Document (2025), semua perangkat dengan Android 9+ wajib mendukung Keystore perangkat keras melalui TEE atau StrongBox.

Kunci di Keystore diidentifikasi dengan alias — string yang diteruskan saat pembuatan atau pemuatan kunci. Keystore tidak mengizinkan akses ke materi kunci mentah: metode getEncoded() mengembalikan null untuk kunci yang dibuat di Keystore. Ini adalah perbedaan mendasar dari kunci perangkat lunak — penyerang tidak dapat mengekstrak kunci privat bahkan dengan kendali penuh atas perangkat.

Keystore terintegrasi dengan mekanisme keamanan Android lainnya: autentikasi biometrik (BiometricPrompt), enkripsi tingkat file (File-Based Encryption) dan fungsi verifikasi SafetyNet / Play Integrity. Kunci dapat dikonfigurasi untuk penghapusan otomatis dalam kondisi tertentu: saat penghapusan kode sandi, saat penambahan sidik jari baru, atau saat masa berlaku habis.

Arsitektur Android Keystore

Arsitektur Android Keystore mencakup tiga tingkat implementasi yang berbeda dalam tingkat perlindungan perangkat keras. Tingkat tergantung pada kemampuan perangkat keras perangkat.

Hardware-backed Keystore (TEE)

TEE (Trusted Execution Environment) — area terisolasi yang bekerja paralel dengan sistem operasi utama pada prosesor yang sama. TEE menggunakan teknologi ARM TrustZone, yang membagi inti fisik prosesor menjadi dua bagian virtual: Normal World (Android) dan Secure World (TEE). Kode di Secure World memiliki akses ke memori dan periferal yang tidak dapat diakses dari Normal World.

Saat aplikasi memanggil operasi kriptografis melalui Keystore, permintaan dikirim melalui Keymaster HAL ke TEE, di mana operasi dilakukan secara perangkat keras. Hasilnya dikembalikan ke aplikasi, tetapi kunci privat tetap berada di memori terlindungi TEE. TEE bersertifikat sesuai GlobalPlatform TEE Protection Profile dan merupakan persyaratan wajib untuk Android 9+ pada perangkat dengan prosesor yang mendukung TrustZone.

TEE mendukung algoritma AES/GCM (128, 256 bit), RSA (2048, 4096 bit), EC (P-256, P-384, P-521) dan HMAC-SHA256. Kinerja TEE lebih rendah dari kriptografi perangkat lunak (20–40% lebih rendah), tetapi untuk operasi tipikal (tanda tangan JWT, dekripsi kunci sesi) keterlambatan tidak melebihi 10–50 ms.

StrongBox Keymaster

StrongBox — chip keamanan khusus, secara fisik terpisah dari prosesor utama. Tidak seperti TEE yang berbagi waktu prosesor dengan Android, StrongBox memiliki CPU sendiri, RAM, True Random Number Generator (TRNG) dan penyimpanan terlindungi (One-Time Programmable memory). StrongBox bersertifikat Common Criteria EAL 4+ dan Secure IC Protection Profile.

StrongBox tersedia pada perangkat dengan Android 9+ dengan syarat adanya chip yang sesuai (misalnya, Titan M pada Google Pixel, Knox pada Samsung Galaxy). Pengembang mengaktifkan StrongBox melalui flag setIsStrongBoxBacked(true) di KeyGenParameterSpec. Jika tidak ada dukungan perangkat keras, flag diabaikan dan Keystore beralih ke TEE.

Keterbatasan StrongBox: mendukung set algoritma terbatas (AES-256, EC P-256, HMAC-SHA256), antrian operasi — maksimal satu pada satu waktu, jumlah operasi — terbatas oleh sumber daya chip. StrongBox tidak dirancang untuk skenario beban tinggi — gunakan TEE untuk operasi yang sering dan StrongBox hanya untuk kunci kritis (kunci master enkripsi, kunci tanda tangan).

Software-based Keystore

Software-based Keystore — implementasi perangkat lunak yang digunakan pada perangkat tanpa dukungan perangkat keras TEE atau StrongBox. Kunci disimpan dalam bentuk terenkripsi di sistem file, tetapi kunci privat dapat didekripsi sementara di RAM. Keystore Perangkat Lunak kurang aman — penyerang dengan akses root dapat mencegat kunci di memori.

Mulai Android 12 (API 31), Google mewajibkan dukungan perangkat keras Keystore untuk semua perangkat baru. Perangkat dengan Android 9–11 mungkin memiliki Keystore perangkat lunak pada model anggaran. Pengembang dapat memeriksa tingkat perlindungan melalui KeyStore.getKeyCharacteristics() — atribut SECURITY_LEVEL_TRUSTED_ENVIRONMENT atau SECURITY_LEVEL_STRONGBOX mengonfirmasi perlindungan perangkat keras.

Algoritma dan fungsi yang didukung

Android Keystore mendukung berbagai algoritma kriptografis yang dibagi ke dalam kategori berdasarkan jenis kunci. Pemilihan algoritma memengaruhi kinerja, kompatibilitas, dan tingkat keamanan.

AES (Advanced Encryption Standard) — enkripsi simetris untuk melindungi data di perangkat. Mode yang direkomendasikan: AES/GCM/NoPadding (256 bit). GCM menyediakan enkripsi terautentikasi (AEAD) — verifikasi integritas data terenkripsi. Ukuran IV (Vektor Inisialisasi): 12 byte untuk GCM. Jangan gunakan AES/ECB — tidak memberikan perlindungan yang memadai.

RSA (Rivest–Shamir–Adleman) — enkripsi asimetris untuk melindungi kunci sesi dan tanda tangan digital. Ukuran yang direkomendasikan: 2048 atau 4096 bit. Mode: RSA/ECB/PKCS1Padding (enkripsi) dan RSA/ECB/PKCS1Sign (tanda tangan). RSA 1024 dianggap usang dan tidak direkomendasikan untuk aplikasi baru (NIST SP 800-131A Rev. 2).

EC (Elliptic Curve) — kriptografi asimetris pada kurva eliptik untuk tanda tangan dan pertukaran kunci. Kurva yang didukung: secp256r1 (P-256, wajib), secp384r1 (P-384) dan secp521r1 (P-521). EC memberikan keamanan yang sebanding dengan RSA dengan ukuran kunci yang jauh lebih kecil. P-256 direkomendasikan untuk sebagian besar skenario: didukung oleh semua perangkat dan memberikan tingkat keamanan 128-bit.

HMAC (Hash-based Message Authentication Code) — autentikasi pesan simetris. Fungsi hash yang didukung: SHA-256, SHA-384, SHA-512. HMAC digunakan untuk memverifikasi integritas dan keaslian data, misalnya, untuk verifikasi permintaan webhook atau pemeriksaan integritas konfigurasi.

Semua algoritma dapat diikat ke autentikasi biometrik melalui KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true). Di Android 11+ tersedia flag setUserAuthenticationParameters() dengan batas waktu (dalam detik) di mana kunci tersedia setelah autentikasi biometrik, tanpa permintaan berulang.

Contoh kode: generasi dan penggunaan kunci

Mari kita lihat contoh praktis bekerja dengan Android Keystore di Kotlin: generasi kunci AES, enkripsi data, dan pembuatan pasangan asimetris untuk tanda tangan.

Generasi kunci AES di Keystore

Contoh membuat kunci AES/GCM 256-bit dengan pengikatan ke autentikasi biometrik. Kunci tidak tersedia untuk ekspor melalui getEncoded().

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

Enkripsi data AES/GCM

Contoh mengenkripsi data menggunakan kunci dari Android Keystore. Cipher mendapatkan kunci berdasarkan alias, menginisialisasi enkripsi AES/GCM dan mengembalikan data terenkripsi bersama dengan IV.

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 + data terenkripsi
    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)
}

Generasi pasangan RSA untuk tanda tangan

Contoh membuat pasangan kunci RSA-2048 di Keystore dengan pengikatan ke StrongBox. Kunci privat digunakan untuk tanda tangan, kunci publik dapat diekspor melalui getEncoded().

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

    // Kunci publik dapat diekspor
    val publicKey = pair.public // X509EncodedKeySpec
}

Praktik terbaik bekerja dengan Android Keystore

Penggunaan Android Keystore yang efektif memerlukan kepatuhan pada aturan yang memberikan perlindungan maksimal dengan tetap mempertahankan kinerja.

Gunakan KeyGenParameterSpec dengan parameter minimal yang diperlukan: tentukan hanya purpose, block modes dan paddings yang benar-benar digunakan. Parameter berlebihan (misalnya, PURPOSE_ENCRYPT untuk kunci yang hanya digunakan untuk tanda tangan) menciptakan vektor serangan tambahan. Android merekomendasikan untuk secara eksplisit menentukan digest untuk tanda tangan — SHA256 adalah tingkat minimum yang dapat diterima (SHA1 sudah usang).

Ikat kunci ke biometri untuk operasi kritis: setUserAuthenticationRequired(true) menjamin bahwa kunci hanya dapat digunakan setelah autentikasi biometrik. Di Android 11+ gunakan setUserAuthenticationParameters() dengan batas waktu (disarankan 30–60 detik) agar tidak meminta biometri untuk setiap operasi dalam satu sesi. setInvalidatedByBiometricEnrollment(true) secara otomatis menghapus kunci saat penambahan sidik jari atau wajah baru — ini mencegah akses dengan data biometrik lama.

Periksa tingkat keamanan pada tahap inisialisasi: gunakan KeyStore.getKeyCharacteristics() untuk menentukan SECURITY_LEVEL. Jika perangkat hanya mendukung Keystore perangkat lunak (SECURITY_LEVEL_SOFTWARE), buat keputusan: baik menolak fungsionalitas, atau menggunakan enkripsi tambahan (misalnya, membungkus kunci dengan kata sandi pengguna). Jangan bergantung pada StrongBox jika tidak dijamin — selalu tentukan flag setIsStrongBoxBacked(true) dan periksa hasilnya melalui getKeyCharacteristics.

Perbarui kunci sesuai jadwal: kunci kriptografis memiliki masa pakai yang disarankan. NIST SP 800-57 merekomendasikan penggantian kunci AES setiap 1–2 tahun, pasangan RSA/EC setiap 2–3 tahun. Implementasikan mekanisme rotasi kunci: saat aplikasi dimulai, periksa tanggal pembuatan kunci (KeyGenParameterSpec.Builder.setKeyValidityStart/End) dan buat kunci baru saat masa berlaku habis. Data lama yang dienkripsi dengan kunci lama harus didekripsi dan dienkripsi ulang dengan yang baru.

Jangan gunakan Keystore untuk data besar: Keystore dirancang untuk menyimpan kunci (beberapa ratus byte), bukan untuk mengenkripsi file besar. Untuk enkripsi data gunakan skema: buat kunci AES acak (DEK — Data Encryption Key), enkripsi data dengan kunci ini, dan enkripsi DEK dengan kunci Keystore (KEK — Key Encryption Key). Android EncryptedSharedPreferences menggunakan skema ini persis: kunci master di Keystore, data — AES-256 GCM.

Pertanyaan yang Sering Diajukan

Bisakah kunci privat diperoleh dari Android Keystore?

Tidak, Android Keystore dirancang sehingga kunci privat tidak pernah meninggalkan TEE atau StrongBox. Metode getEncoded() mengembalikan null untuk kunci yang dibuat di Keystore. Kunci hanya dapat digunakan melalui Cipher, Signature atau Mac API — materi mentah tidak tersedia.

Apa perbedaan antara TEE dan StrongBox?

TEE (TrustZone) — isolasi virtual pada prosesor yang sama, menggunakan pembagian waktu. StrongBox — chip terpisah dengan CPU dan memori sendiri. StrongBox lebih aman (Common Criteria EAL 4+), tetapi lebih lambat dan mendukung lebih sedikit algoritma. TEE cocok untuk operasi yang sering, StrongBox untuk kunci kritis.

Bagaimana cara memeriksa apakah perangkat mendukung StrongBox?

Gunakan KeyStore.getKeyCharacteristics() setelah menghasilkan kunci dengan flag setIsStrongBoxBacked(true). Atribut SECURITY_LEVEL_STRONGBOX mengonfirmasi dukungan perangkat keras. Jika perangkat tidak mendukung StrongBox, Keystore beralih ke TEE tanpa kesalahan — Anda harus secara eksplisit memeriksa tingkat keamanan.

Apa yang terjadi pada kunci saat aplikasi dihapus?

Kunci di Keystore secara otomatis dihapus saat aplikasi dihapus dari perangkat. Di Android 10+, kunci dapat dipertahankan jika aplikasi memiliki flag allowBackup=true di manifes, tetapi tidak akan tersedia setelah instalasi ulang. Disarankan untuk menghasilkan kunci baru saat instalasi bersih.

Bisakah satu kunci digunakan di beberapa perangkat?

Tidak, Android Keystore terikat pada perangkat keras perangkat tertentu. Kunci yang dihasilkan di TEE satu perangkat tidak dapat ditransfer ke perangkat lain. Untuk enkripsi lintas platform gunakan skema: Keystore melindungi kunci di perangkat, dan kunci sesi dikirim melalui API yang aman dengan enkripsi asimetris.

Kesimpulan

  • Android Keystore — penyedia sistem untuk melindungi kunci kriptografis di lingkungan terisolasi perangkat keras (TEE atau StrongBox).
  • TEE (TrustZone) — isolasi virtual pada prosesor yang sama, wajib untuk Android 9+ pada perangkat dengan TrustZone.
  • StrongBox — chip keamanan khusus dengan sertifikasi Common Criteria EAL 4+, diaktifkan melalui setIsStrongBoxBacked(true).
  • KeyGenParameterSpec — kelas sentral untuk mengonfigurasi parameter kunci: algoritma, ukuran, pengikatan biometrik dan rotasi.
  • Kunci tidak dapat diekstrak — materi privat tidak tersedia melalui getEncoded(), operasi dilakukan di dalam TEE/StrongBox.
  • Algoritma yang direkomendasikan — AES/GCM/NoPadding (256 bit) untuk enkripsi, EC P-256 untuk tanda tangan, RSA 2048 untuk skenario asimetris.
  • Skema KEK/DEK — Keystore menyimpan kunci master untuk melindungi kunci enkripsi data, memastikan kinerja dan keamanan.

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