
Google I / O 2019 telah mereda dan ini saatnya menulis ulang proyek pada arsitektur baru pelajari hal-hal baru. Karena saya tertarik pada keamanan aplikasi mobile, saya pertama kali menarik perhatian ke perpustakaan baru dalam keluarga JetPack - security-crypto . Perpustakaan membantu mengatur enkripsi data dengan benar dan pada saat yang sama melindungi pengembang dari semua nuansa yang menyertai proses ini.
Latar belakang sejarah
Enkripsi data di Android selalu menghasilkan banyak diskusi. Algoritma mana yang harus dipilih? Mode enkripsi apa yang digunakan? Apa itu padding? Di mana menyimpan kunci? Mempelajari semua ini dan terus memperbarui pengetahuan Anda mungkin sulit bagi pengembang rata-rata. Oleh karena itu, cerita yang paling sering berakhir di salah satu dari tiga skenario:
- copy-paste solusi pertama dengan stackoverflow
- mencari “manual yang sesuai” dengan implementasi selanjutnya dan pengumpulan rake
- aktivasi protokol "Dan itu akan!"
Seiring berkembangnya komunitas pengembang android, perpustakaan mulai muncul untuk membantu menyelesaikan masalah ini. Kualitas solusi ini sangat berbeda: dari semua varietas ini, saya hanya dapat memilih java-aes-crypto , yang kami gunakan di Redmadrobot. Implementasi yang agak berkualitas tinggi, tetapi ada beberapa masalah dengannya.
Pertama-tama, itu hanya enkripsi string. Ini sendiri tidak buruk, tetapi string ini perlu disimpan di suatu tempat, dalam database atau SharedPreferences. Jadi, Anda perlu menulis pembungkus di atas sumber data sehingga semuanya dienkripsi dengan cepat (yang pernah kami lakukan). Tetapi ini adalah kode yang perlu didukung, diseret dari proyek ke proyek atau dieksekusi di perpustakaan untuk kemudahan penggunaan. Pada akhirnya, ini juga dilakukan, tetapi tidak membawa kenyamanan bagi pikiran yang ingin tahu.
Kedua, solusi ini tidak menawarkan apa pun untuk menyelesaikan masalah manajemen utama. Mereka dapat dihasilkan, tetapi penyimpanan sepenuhnya jatuh di pundak pengembang. Dengan semua jongkok di AndroidKeystore pada berbagai versi OS dan perangkat yang berasal dari Cina Daratan.
Kota ini membutuhkan pahlawan baru
Semuanya berjalan seperti biasa sampai pada musim panas tahun 2018, saya menemukan bahwa ada perpustakaan yang luar biasa dari Google seperti Tink . Sangat mudah untuk mempelajari dan melindungi pengembang dari sejumlah besar nuansa yang terkait dengan kriptografi. Menggunakan perpustakaan ini, hampir tidak mungkin untuk melakukan sesuatu yang salah. Selain itu, Tink mengambil kendali penuh atas kunci dan abstrak semua operasi dengan AndroidKeystore dari pengembang.
Tapi itu masih enkripsi string saja. Dan di sini Binary Preferences muncul dengan sangat sukses - perpustakaan dari pabrikan domestik yang sudah lama ingin saya lihat. Ini memungkinkan Anda untuk mengenkripsi semua data yang tersimpan dari algoritma apa pun - untuk ini cukup menulis implementasi dua antarmuka, KeyEncryption dan ValueEncryption (masing-masing untuk kunci dan nilai).
Sebagai hasilnya, kami mulai menggunakan dua pustaka ini bersama-sama dan merasa senang bahwa kode kami menjadi lebih bersih dan lebih mudah dipahami.
keamanan-crypto

Sekarang Google sekali lagi memutuskan untuk bertemu dengan para pengembang dan menyederhanakan hidup mereka di bidang enkripsi data yang disimpan. Pustaka JetPack lain diumumkan untuk membantu hal ini. Saya bertanya-tanya apa yang mereka tulis begitu revolusioner di sana, dan saya naik untuk mencari dokumentasi (spoiler: tidak). Saya hanya menemukan javadoc di kelas-kelas yang termasuk dalam perpustakaan, tetapi terima kasih juga untuk itu. Ternyata ada beberapa peluang: enkripsi file, SharedPreferences dan bekerja dengan kunci.
Untuk menguji fungsionalitas perpustakaan, saya menulis beberapa cuplikan:
Enkripsi fileval file = File(filesDir, "super_secure_file") val encryptedFile = EncryptedFile.Builder(file, this, "my_secret_key", EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB) .setKeysetAlias("my_test_keyset_alias") .setKeysetPrefName("keyset_pref_file") .build() val outputStream = encryptedFile.openFileOutput() outputStream.use { it.write("secret info".toByteArray()) }
Enkripsi SharedPreferences val encryptedPreferences = EncryptedSharedPreferences.create( "super_secret_preferences", "prefrences_master_key", this, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) encryptedPreferences.edit().putString("secret", "super secret token")
Yang sangat mengejutkan saya, semuanya bekerja pertama kali, dan saya harus melihat kode apa yang mereka tulis untuk perpustakaan ini. Setelah jatuh ke sumber, saya melihat bahwa ini sebenarnya adalah pembungkus di sekitar perpustakaan Tink yang sudah kita ketahui, dan kode tertulis hampir satu-ke-satu ketika kami menulis untuk BinaryPreferences terenkripsi.
Saya sangat senang bahwa kali ini Google tidak menciptakan sepeda moped, tetapi menggunakan praktik mapannya sendiri. Mari kita berharap bahwa paket security
yang datang ke JetPack tidak akan terbatas hanya pada perpustakaan ini, tetapi akan dikembangkan lebih lanjut.
Demonstrasi BinaryPreferences + Bundel Tink
Kode sumber pustaka security-crypto
Demo keamanan-crypto