EncryptedSharedPreferences — adalah komponen pustaka AndroidX Security yang menyediakan enkripsi transparan data yang disimpan melalui API SharedPreferences. Tidak seperti SharedPreferences biasa, di mana data disimpan dalam file XML terbuka, EncryptedSharedPreferences secara otomatis mengenkripsi kunci dan nilai sebelum menulis ke disk. Menurut Android Developers, pustaka ini menggunakan AES-256 GCM untuk nilai dan AES-256 SIV (RFC 5297) untuk kunci, memastikan kerahasiaan dan integritas data.
Poin Utama
EncryptedSharedPreferences — adalah kelas dari paket androidx.security.crypto, diperkenalkan di AndroidX Security 1.0.0 (2019). Kelas ini mengimplementasikan antarmuka SharedPreferences, tetapi semua operasi penulisan (putString, putInt, putBoolean dll.) mengenkripsi data terlebih dahulu, dan operasi pembacaan mendekripsinya sebelum dikembalikan.
SharedPreferences standar menyimpan data dalam file XML di direktori aplikasi (/data/data/package/shared_prefs/). File tidak dienkripsi — dengan akses root ke perangkat atau analisis cadangan, semua data terbaca sebagai XML biasa. Token autentikasi, kunci API, data pribadi pengguna menjadi tersedia bagi penyerang.
EncryptedSharedPreferences memecahkan masalah ini di tingkat pustaka: data dienkripsi sebelum ditulis ke disk dan didekripsi saat dibaca. Pengembang tidak perlu memanggil fungsi kriptografi secara manual — API tetap identik dengan SharedPreferences biasa.
Pustaka AndroidX Security v1.0.0 dirilis pada Desember 2019. EncryptedSharedPreferences menggantikan pendekatan usang dengan enkripsi manual melalui Cipher + SharedPreferences. Versi stabil saat ini adalah 1.1.0-alpha06 (2024), yang mendukung API 19+. Pustaka ini adalah bagian dari Jetpack dan tidak memerlukan izin tambahan.
Menurut Google Security Blog (2024), EncryptedSharedPreferences adalah metode yang direkomendasikan untuk menyimpan pengaturan aplikasi rahasia yang tidak memerlukan sinkronisasi melalui cloud. Untuk skenario yang lebih kompleks, Room dengan enkripsi melalui SQLCipher direkomendasikan.
EncryptedSharedPreferences menggunakan skema enkripsi dua tingkat: kunci master (Master Key) disimpan di Android Keystore, dan untuk enkripsi data digunakan kunci turunan. Ini adalah kombinasi perlindungan Keystore dan kinerja enkripsi simetris.
Untuk nilai digunakan AES-256 GCM (Galois/Counter Mode) — mode enkripsi terautentikasi (AEAD), yang memastikan kerahasiaan dan integritas data. Untuk kunci (nama parameter) diterapkan AES-256 SIV (RFC 5297) — enkripsi deterministik, yang diperlukan untuk pencarian berdasarkan kunci tanpa mengungkapkan isinya.
Setiap file EncryptedSharedPreferences berisi pasangan kunci-nilai yang dienkripsi. Struktur file: pertama header dengan metadata (versi, identifikasi kunci), kemudian daftar entri terenkripsi. File bukan XML yang valid dan tidak dapat dibaca oleh editor teks.
Kelas MasterKey bertanggung jawab untuk membuat dan mengelola kunci master 256-bit yang disimpan di Android Keystore. MasterKey.Builder memungkinkan konfigurasi: jenis penyimpanan (Keystore atau perangkat lunak), perlindungan biometrik, masa berlaku kunci. Secara default, kunci master dibuat di Android Keystore dengan algoritma AES/GCM/NoPadding.
import androidx.security.crypto.MasterKey
import androidx.security.crypto.EncryptedSharedPreferences
fun getEncryptedPrefs() {
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.AES256_GCM_SPEC)
.build()
val prefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
}
EncryptedSharedPreferences.create menerima lima parameter: konteks, nama file, kunci master, skema enkripsi kunci dan skema enkripsi nilai. Pemilihan skema memengaruhi kinerja dan tingkat perlindungan.
AES256_SIV — enkripsi deterministik: kunci identik selalu menghasilkan teks terenkripsi yang sama. Ini diperlukan untuk pencarian berdasarkan kunci (SharedPreferences.getX(key)). Kekurangan: penyerang dapat menentukan kunci mana yang digunakan dari teks terenkripsi yang berulang. AES256_SIV2 — versi yang ditingkatkan dengan randomisasi tambahan.
Untuk nilai digunakan AES256_GCM. GCM menambahkan IV 12-byte (vektor inisialisasi) dan tag autentikasi 16-byte ke setiap nilai. Ini memastikan kerahasiaan (tidak ada yang dapat membaca nilai) dan autentikasi (tidak ada yang dapat mengubah nilai tanpa terdeteksi).
Metode setUserAuthenticationRequired(true) di MasterKey.Builder memerlukan konfirmasi biometrik sebelum mendapatkan kunci master dari Keystore. Ini menambahkan lapisan tambahan: bahkan jika aplikasi berjalan di perangkat yang tidak terkunci, penyerang tidak dapat membaca EncryptedSharedPreferences tanpa Face ID atau Touch ID.
Penting: dengan setUserAuthenticationRequired, kunci master menjadi tidak tersedia jika pengguna mengubah atau menghapus biometrik. KeyPermanentlyInvalidatedException harus ditangani dan kunci master baru harus dibuat dengan migrasi data.
fun createBiometricKey(): MasterKey {
return MasterKey.Builder(context)
.setKeyScheme(MasterKey.AES256_GCM_SPEC)
.setUserAuthenticationRequired(true)
.setRequestStrongBoxBacked(true)
.build()
}
fun writeSecureToken(token: String) {
try {
prefs.edit().putString("auth_token", token).apply()
} catch (e: KeyPermanentlyInvalidatedException) {
// Biometrik berubah — kunci perlu dibuat ulang
}
}
Mari kita lihat contoh lengkap integrasi EncryptedSharedPreferences di aplikasi Android dengan Kotlin. Pustaka androidx.security:security-crypto ditambahkan melalui Gradle.
Di file build.gradle (app) tambahkan: implementation “androidx.security:security-crypto:1.1.0-alpha06”. Untuk proyek Kotlin, kotlin-stdlib juga diperlukan. Inisialisasi MasterKey dilakukan sekali, biasanya di Application.onCreate atau melalui container DI.
Setelah membuat instance EncryptedSharedPreferences, API tidak berbeda dengan SharedPreferences biasa. edit() mengembalikan Editor, semua metode (putString, getString, putBoolean, getBoolean) bekerja dengan cara yang sama. Perbedaannya hanya di dalam: data dienkripsi saat menulis dan didekripsi saat membaca.
class AuthRepository(context: Context) {
private val prefs = createEncryptedPrefs(context)
fun saveCredentials(login: String, password: String) {
prefs.edit()
.putString("login", login)
.putString("password", password)
.apply()
}
fun getToken(): String? {
return prefs.getString("auth_token", null)
}
fun clearAll() {
prefs.edit().clear().apply()
}
}
Untuk migrasi data yang ada dari SharedPreferences yang tidak dilindungi ke EncryptedSharedPreferences perlu: membaca semua data dari file lama, membuat EncryptedSharedPreferences baru, menulis semua data, menghapus file lama. Google tidak menyediakan migrator bawaan — pengembang mengimplementasikannya sendiri.
Pilihan antara SharedPreferences dan EncryptedSharedPreferences tergantung pada jenis data yang disimpan. Untuk pengaturan antarmuka (tema, bahasa, pengurutan) SharedPreferences biasa sudah cukup. Untuk informasi rahasia (token, kata sandi, kunci) EncryptedSharedPreferences wajib digunakan.
EncryptedSharedPreferences lebih lambat dari yang biasa karena operasi kriptografi. Penulisan satu nilai string memakan waktu ~5-15 ms (tergantung ukuran data dan akselerasi perangkat keras AES). Pembacaan — 2-5 ms. Untuk sebagian besar aplikasi, ini tidak terlihat, tetapi pada operasi batch (migrasi, pemulihan) sebaiknya gunakan apply() daripada commit().
SharedPreferences biasa tidak memberikan perlindungan kriptografi apa pun: file XML dapat dibaca oleh proses apa pun dengan akses root atau melalui adb backup. EncryptedSharedPreferences mengenkripsi data di tingkat aplikasi, dan kunci master disimpan di Android Keystore dengan kemungkinan perlindungan perangkat keras (StrongBox).
| Karakteristik | SharedPreferences | EncryptedSharedPreferences |
|---|---|---|
| Penyimpanan | XML terbuka | File biner terenkripsi |
| Enkripsi | Tidak | AES-256 GCM + SIV |
| Perlindungan kunci | Tidak | Android Keystore + StrongBox |
| Kinerja | 0.1-1 ms | 2-15 ms |
| Rekomendasi | Pengaturan UI | Token, kunci, PII |
Gunakan EncryptedSharedPreferences untuk menyimpan: refresh token OAuth, kunci API untuk layanan eksternal, email atau nomor telepon pengguna, pengaturan aplikasi rahasia (PIN, flag autentikasi). Untuk menyimpan data biometrik atau dokumen besar, EncryptedSharedPreferences tidak cocok — gunakan EncryptedFile atau Room dengan SQLCipher.
Aturan umum: jika kebocoran data akan merugikan pengguna atau bisnis — gunakan EncryptedSharedPreferences. Jika data hanya kosmetik (tema, bahasa, pengurutan) — SharedPreferences biasa. EncryptedSharedPreferences masuk akal untuk diterapkan segera, tanpa refactoring: penggantian di proyek yang ada memerlukan migrasi dan pemrosesan data lama yang tidak terenkripsi.
Ingat bahwa EncryptedSharedPreferences hanya melindungi data di disk — tidak selama aplikasi berjalan. Jika penyerang memiliki akses ke memori proses, data yang didekripsi dapat disadap. Gunakan perlindungan tambahan: ProGuard/DexGuard untuk obfuscation kode.
Pertanyaan yang Sering Diajukan
Jetpack DataStore — adalah alternatif yang lebih modern untuk SharedPreferences, berdasarkan Flow dan Kotlin coroutines. DataStore tidak mengenkripsi data secara default, tetapi dapat dikombinasikan dengan EncryptedSharedPreferences atau digunakan dengan enkripsi manual melalui Proto DataStore dengan protokol kriptografi.
Tidak disarankan. EncryptedSharedPreferences dirancang untuk volume kecil (hingga 100-200 KB). Untuk data besar, gunakan Room dengan SQLCipher atau enkripsi file melalui EncryptedFile dari pustaka AndroidX Security yang sama.
Tidak, migrasi skema otomatis tidak ada. Saat mengubah struktur data, pengembang harus membaca data lama secara manual melalui KeyGen lama dan menulisnya melalui yang baru. Disarankan untuk menyimpan versi skema di parameter terpisah.
AndroidX Security 1.0.0 mendukung API 19+ (Android KitKat). Versi 1.1.0-alpha06 juga mendukung API 19+. Untuk StrongBox, diperlukan API 28+ dan perangkat dengan dukungan perangkat keras (Google Pixel 3+, Samsung Galaxy S9+).
Ya, refresh token — adalah salah satu skenario penggunaan utama. Enkripsi AES-256 GCM, kunci master di Keystore, perlindungan biometrik — tingkat yang cukup untuk token OAuth. Untuk access token dengan masa berlaku pendek juga cocok, meskipun beberapa tim lebih suka menyimpannya di memori.
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