Selamat siang Nama saya Dmitry dan saya seorang guru kursus dasar "Pengembang Android" di Otus. Hari ini saya memutuskan untuk membagikan terjemahan artikel, yang menurut saya menarik dan saya pikir itu bisa bermanfaat bagi banyak pembaca blog kami.

Menyimpan data dalam SharedPreferences sangat cepat dan nyaman. Penyerang juga mudah melihat data yang disimpan dalam SharedPreferences ... jadi berhati-hatilah dengan apa yang Anda letakkan di sana, dan Anda mungkin harus memikirkan cara menyimpan data dalam format terenkripsi.
Untuk sejumlah kecil data yang tidak membenarkan penggunaan mesin basis data seperti SqlCipher, kemampuan kami terbatas:
- Metode enkripsi asli (jika Anda tahu apa yang Anda lakukan)
- Solusi siap pakai seperti Preferensi aman, Preferensi aman lainnya, Armadillo, dll.
- Memerangi masalah siklus hidup sistem Android Keystore yang paling aneh di setiap versi Android
Ini bekerja sebelumnya, tetapi sekarang kami memiliki solusi yang tepat dan
resmi .
Meskipun masih alpha, itu bekerja dengan baik untuk sementara waktu ketika saya menggunakannya dalam proyek saya. Selamat menggunakan
EncryptedSharedPreferences (atau Anda dapat menggunakannya), untuk Anda semua dengan
min-sdk 23+ .
Mari kita lihat contoh cara menggunakannya:
Contoh EncryptedSharedPreferences
SDK minimum
Hari ini 23 (Android 6.0)
minSdkVersion 23
Tambahkan Dependensi
implementation "androidx.security:security-crypto:1.0.0-alpha02"
Inisialisasi / Buka
Cukup buat atau ambil kunci master dari keystore Android dan gunakan untuk menginisialisasi / membuka contoh EncryptedSharedPreferences:
Simpan Catatan
Simpan data seperti yang selalu Anda lakukan dengan SharedPreferences:
Baca catatan
Baca data seperti yang selalu Anda lakukan dengan SharedPreferences:
Apakah pengaturan benar-benar dienkripsi?
Ya, dan terenkripsi dengan sangat baik.
Katakanlah saya meletakkan nilai
akaita
di
SharedPreferences
. Seperti apa file tersebut nantinya:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="DATA">akaita</string> </map>
Jika saya menambahkan nilai
akaita
ke
EncryptedSharedPreferences
, saya mendapatkan sesuatu yang sama sekali berbeda:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="AVz2qCVxm1KudCCJKYuxuoaAXoPeWKjG0w==">ASnO9uni11t3m9sNgDJbiYllL/tE+i99TYKfQ0h8XV6AUN0O3rBxBsMmcpw2DCY=</string> <string name="__androidx_security_crypto_encrypted_prefs_key_keyset__">12a901eb372af4775b09f5b51d20d49428931c5d8e0b17dd103d2169c1879b8b13958274d7e25d3cc052f301461495fd40b70806ae244f456726802460318bdf19dce444e7a60f20c903c5a57140ea8e90a19a1b48559961d145a50000d1c0e22ca918b02ea0cc34e433900f44c00e9c791ecb678f26d293c0226d6c2a9e25e610616ec34241b06410481427a850eeedf85ee4c725d5dbd715b5a8d0e017be9a568a9f960989271d14d2d0531a4408a5d0dae705123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b6579100118a5d0dae7052001</string> <string name="__androidx_security_crypto_encrypted_prefs_value_keyset__">12880189e734bbbf9cfa3bc15b5e53ea8df03341269cf97112a60a1f6482732dd33248b3f821397fb04ef3372ff54336e9045a0b0c0fb7afdf475dbc98a1107d09de66afcc5ad063e5e5b59a7d616e14834e19769bc84de7e5c8716a811814a6cd7a6d72a1c64ce4317f2f482181c437b70f010219ca6407a98bac18f1101c02fd8e2c4a9009ad2a1ebbdc1a4408e9edbbce02123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e41657347636d4b6579100118e9edbbce022001</string> </map>
"> 12a901eb372af4775b09f5b51d20d49428931c5d8e0b17dd103d2169c1879b8b13958274d7e25d3cc052f301461495fd40b70806ae244f456726802460318bdf19dce444e7a60f20c903c5a57140ea8e90a19a1b48559961d145a50000d1c0e22ca918b02ea0cc34e433900f44c00e9c791ecb678f26d293c0226d6c2a9e25e610616ec34241b06410481427a850eeedf85ee4c725d5dbd715b5a8d0e017be9a568a9f960989271d14d2d0531a4408a5d0dae705123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b6579100118a5d0dae7052001 </ string> <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="AVz2qCVxm1KudCCJKYuxuoaAXoPeWKjG0w==">ASnO9uni11t3m9sNgDJbiYllL/tE+i99TYKfQ0h8XV6AUN0O3rBxBsMmcpw2DCY=</string> <string name="__androidx_security_crypto_encrypted_prefs_key_keyset__">12a901eb372af4775b09f5b51d20d49428931c5d8e0b17dd103d2169c1879b8b13958274d7e25d3cc052f301461495fd40b70806ae244f456726802460318bdf19dce444e7a60f20c903c5a57140ea8e90a19a1b48559961d145a50000d1c0e22ca918b02ea0cc34e433900f44c00e9c791ecb678f26d293c0226d6c2a9e25e610616ec34241b06410481427a850eeedf85ee4c725d5dbd715b5a8d0e017be9a568a9f960989271d14d2d0531a4408a5d0dae705123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b6579100118a5d0dae7052001</string> <string name="__androidx_security_crypto_encrypted_prefs_value_keyset__">12880189e734bbbf9cfa3bc15b5e53ea8df03341269cf97112a60a1f6482732dd33248b3f821397fb04ef3372ff54336e9045a0b0c0fb7afdf475dbc98a1107d09de66afcc5ad063e5e5b59a7d616e14834e19769bc84de7e5c8716a811814a6cd7a6d72a1c64ce4317f2f482181c437b70f010219ca6407a98bac18f1101c02fd8e2c4a9009ad2a1ebbdc1a4408e9edbbce02123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e41657347636d4b6579100118e9edbbce022001</string> </map>
"> 12880189e734bbbf9cfa3bc15b5e53ea8df03341269cf97112a60a1f6482732dd33248b3f821397fb04ef3372ff54336e9045a0b0c0fb7afdf475dbc98a1107d09de66afcc5ad063e5e5b59a7d616e14834e19769bc84de7e5c8716a811814a6cd7a6d72a1c64ce4317f2f482181c437b70f010219ca6407a98bac18f1101c02fd8e2c4a9009ad2a1ebbdc1a4408e9edbbce02123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e41657347636d4b6579100118e9edbbce022001 </ string> <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="AVz2qCVxm1KudCCJKYuxuoaAXoPeWKjG0w==">ASnO9uni11t3m9sNgDJbiYllL/tE+i99TYKfQ0h8XV6AUN0O3rBxBsMmcpw2DCY=</string> <string name="__androidx_security_crypto_encrypted_prefs_key_keyset__">12a901eb372af4775b09f5b51d20d49428931c5d8e0b17dd103d2169c1879b8b13958274d7e25d3cc052f301461495fd40b70806ae244f456726802460318bdf19dce444e7a60f20c903c5a57140ea8e90a19a1b48559961d145a50000d1c0e22ca918b02ea0cc34e433900f44c00e9c791ecb678f26d293c0226d6c2a9e25e610616ec34241b06410481427a850eeedf85ee4c725d5dbd715b5a8d0e017be9a568a9f960989271d14d2d0531a4408a5d0dae705123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b6579100118a5d0dae7052001</string> <string name="__androidx_security_crypto_encrypted_prefs_value_keyset__">12880189e734bbbf9cfa3bc15b5e53ea8df03341269cf97112a60a1f6482732dd33248b3f821397fb04ef3372ff54336e9045a0b0c0fb7afdf475dbc98a1107d09de66afcc5ad063e5e5b59a7d616e14834e19769bc84de7e5c8716a811814a6cd7a6d72a1c64ce4317f2f482181c437b70f010219ca6407a98bac18f1101c02fd8e2c4a9009ad2a1ebbdc1a4408e9edbbce02123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e41657347636d4b6579100118e9edbbce022001</string> </map>
Selain itu, file yang dienkripsi akan berubah setiap kali kita simpan, yang membuatnya sulit diakses.
Peringatan besar : kinerja
Ada perbedaan kinerja yang signifikan antara SharedPreferences dan EncryptedSharedPreferences.
Anda dapat memeriksanya sendiri menggunakan kode sampel saya atau hanya mengunduh aplikasi sampel dari Play Store. Saya sendiri melakukan beberapa tes pada perangkat nyata, mendapatkan hasil sebagai berikut:
EncryptedSharedPreferences vs. SharedPreferences
Grafik "Preferensi Dienkripsi Terenkripsi versus SharedPreferensi"Kesimpulan
EncryptedSharedPreferences adalah solusi yang andal dan sangat sederhana untuk Android 6.0 dan lebih tinggi.
Ini memiliki dua kelebihan:
- kita tidak perlu menyandikan apa pun dalam kode kita. Dia hanya menggunakan Android Keystore untuk kita, menghilangkan kebutuhan untuk menghadapinya.
- pengguna tidak perlu mengatur layar kunci. EncryptedSharedPreferences akan bekerja dengan baik tanpa kunci layar
Ini adalah pengganti yang hampir lengkap untuk SharedPreferences. Pastikan saja menginisialisasi / membuka EncryptedSharedPreferences tidak memengaruhi pengguna Anda.
Keputusan ini pasti akan tetap ada. Saya menggunakan ini dalam skenario yang cocok. Sekarang saya hanya ingin mengatakan bahwa orang-orang dari Android akan meningkatkan kinerjanya, jadi kami dapat lebih khawatir lagi :)
Contoh aplikasi
Hanya untuk membuatnya lebih mudah untuk menguji dan memastikan semuanya terhubung dengan baik, saya membuat aplikasi untuk Anda. Unduh atau kompilasi dan coba!
https://github.com/akaita/encryptedsharepreferences-exampleBeri nilai tambah jika Anda menemukan artikel yang bermanfaat, dan saya akan dengan senang hati menjawab pertanyaan apa pun di komentar.