Preferensi terenkripsi di Android

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:

 //  1:    -   /  val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC) //  2.  /   EncryptedSharedPreferences val sharedPreferences = EncryptedSharedPreferences.create( "PreferencesFilename", masterKeyAlias, applicationContext, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) 

Simpan Catatan


Simpan data seperti yang selalu Anda lakukan dengan SharedPreferences:

 //  3.    EncryptedSharedPreferences sharedPreferences.edit() .putString("DATA", saveText.text.toString()) .apply() 


Baca catatan


Baca data seperti yang selalu Anda lakukan dengan SharedPreferences:
 //  3:    EncryptedSharedPreferences val value = sharedPreferences.getString("DATA", "") 

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:

  1. kita tidak perlu menyandikan apa pun dalam kode kita. Dia hanya menggunakan Android Keystore untuk kita, menghilangkan kebutuhan untuk menghadapinya.
  2. 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-example

Beri nilai tambah jika Anda menemukan artikel yang bermanfaat, dan saya akan dengan senang hati menjawab pertanyaan apa pun di komentar.

Source: https://habr.com/ru/post/id473562/


All Articles