Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Security
Code

Menyimpan Data Secure pada Android

by
Difficulty:AdvancedLength:LongLanguages:

Malay (Melayu) translation by Aisyah Arrafah (you can also view the original English article)

Kredibiliti aplikasi hari ini begitu bergantung pada bagaimana data peribadi pengguna diuruskan. Tumpuan Android mempunyai banyak API yang berkuasa mengelilingi kepercayaan dan penyimpanan utama, dengan ciri khusus hanya tersedia dalam versi tertentu. Siri pendek ini akan bermula dengan pendekatan mudah untuk membangun dan berjalan dengan melihat sistem storan dan bagaimana untuk menyulitkan dan menyimpan data sensitif melalui kod laluan yang disediakan oleh pengguna. Dalam tutorial kedua, kita akan melihat cara yang lebih kompleks untuk melindungi kunci dan kelayakan.

Asas-asas

Persoalan pertama untuk difikirkan adalah berapa data yang anda perlukan untuk memperoleh. Pendekatan yang baik adalah untuk mengelakkan menyimpan data peribadi jika anda tidak perlu.

Untuk data yang mesti anda simpan, senibina Android bersedia membantu. Sejak 6.0 Marshmellow, enkripsi cakera penuh didayakan secara lalai, untuk peranti yang mempunyai keupayaan. Fail dan SharedPreferences yang disimpan oleh apl secara automatik ditetapkan dengan pemalar MODE_PRIVATE. Ini bermakna data boleh diakses hanya oleh aplikasi anda sendiri.

Adalah idea yang baik untuk berpegang kepada lalai ini. Anda boleh menetapkan secara jelas apabila menyimpan keutamaan yang dikongsi.

Atau semasa menyimpan fail.

Elakkan menyimpan data pada storan luaran, kerana data itu kemudiannya dilihat oleh aplikasi dan pengguna lain. Sebenarnya, untuk mengelakkan lebih sukar untuk orang menyalin perduaan dan data aplikasi anda, anda tidak boleh membenarkan pengguna tidak dapat memasang aplikasi pada storan luaran. Menambah android: installLocation dengan nilai internalOnly ke fail manifes akan mencapai itu.

Anda juga boleh menghalang apl dan data daripada disandarkan. Ini juga menghalang memuat turun kandungan direktori data peribadi aplikasi menggunakan sandaran adb. Untuk berbuat demikian, tetapkan android: allowBackup atribut untuk palsu dalam fail manifes. Secara lalai, atribut ini ditetapkan untuk benar.

Ini adalah amalan terbaik, tetapi mereka tidak akan berfungsi untuk peranti yang dikompromi atau berakar, dan penyulitan cakera hanya berguna apabila peranti itu dilindungi dengan skrin kunci. Di sinilah mempunyai kata laluan sebelah aplikasi yang melindungi data dengan penyulitan adalah bermanfaat.

Mengekalkan Data Pengguna Dengan Kata Laluan

Conceal ialah pilihan yang tepat untuk perpustakaan penyulitan kerana ia dapat membantu anda dan berjalan dengan cepat tanpa perlu risau tentang butiran yang mendasari. Walau bagaimanapun, eksploit yang disasarkan untuk rangka kerja yang popular akan menjejaskan semua aplikasi yang bergantung padanya pada masa yang sama.

Ia juga penting untuk mengetahui tentang bagaimana sistem penyulitan bekerja untuk dapat mengetahui jika anda menggunakan rangka kerja tertentu dengan selamat. Oleh itu, untuk jawatan ini kita akan mendapat tangan kita kotor dengan melihat pembekal kriptografi secara langsung.

AES dan Derivasi Berasaskan Kata Laluan

Kami akan menggunakan standard AES yang disyorkan, yang menyulitkan data yang diberikan kunci. Kekunci yang sama digunakan untuk menyulitkan data digunakan untuk menyahsulit data, yang disebut penyulitan simetri. Terdapat saiz utama yang berbeza, dan AES256 (256 bit) adalah panjang pilihan untuk digunakan dengan data sensitif.

Walaupun pengalaman pengguna aplikasi anda harus memaksa pengguna untuk menggunakan kod laluan yang kuat, ada kemungkinan kod laluan yang sama juga akan dipilih oleh pengguna lain. Meletakkan keselamatan data yang disulitkan kami di tangan pengguna tidak selamat. Data kami perlu dicagarkan sebaliknya dengan kunci yang rawak dan cukup besar (iaitu yang mempunyai entropi yang cukup) untuk dianggap kuat. Inilah sebabnya mengapa ia tidak disyorkan untuk menggunakan kata laluan secara langsung untuk menyulitkan data—iaitu di mana fungsi yang dipanggil Fungsi Pengenalan Kata Kunci Berasaskan Kata Laluan (PBKDF2) dimainkan.

PDKDF2 memperoleh kunci dari kata laluan dengan hashing berkali-kali dengan garam. Ini dipanggil regangan kunci. Garam hanyalah urutan data rawak dan menjadikan kunci yang unik unik walaupun kata laluan yang sama digunakan oleh orang lain. Mari mulakan dengan menghasilkan garam itu.

Kelas SecureRandom menjamin bahawa output yang dijana akan sukar untuk diramal t— ia adalah "penjana nombor rawak kriptografi". Sekarang kita boleh meletakkan garam dan kata laluan ke dalam objek penyulitan berasaskan kata laluan: PBEKeySpec. Pembina objek juga mengambil bentuk kiraan lelaran yang menjadikan kunci lebih kuat. Ini adalah kerana meningkatkan bilangan lelaran memperluaskan masa yang diperlukan untuk beroperasi pada satu set kunci semasa serangan kekerasan. PBEKeySpec kemudiannya diluluskan ke SecretKeyFactory, yang akhirnya menghasilkan kunci sebagai array byte []. Kami akan membungkus array byte[] menjadi objek SecretKeySpec.

Ambil perhatian bahawa kata laluan diluluskan sebagai array char[] dan kelas PBEKeySpec menyimpannya sebagai array char[] juga. char[] array biasanya digunakan untuk fungsi penyulitan kerana sementara kelas String tidak berubah, array char[] yang mengandungi maklumat sensitif boleh ditimpa-tulis sehingga menghapus data sensitif sepenuhnya dari RAM phyc peranti.

Vektor Permulaan

Kami kini bersedia untuk menyulitkan data, tetapi kami mempunyai satu lagi perkara yang perlu dilakukan. Terdapat mod penyulitan yang berbeza dengan AES, tetapi kami akan menggunakan yang disyorkan: chaining block chaining (CBC). Ini beroperasi pada data kami satu blok pada satu masa. Perkara yang hebat mengenai mod ini ialah setiap blok data tidak terenkripsi seterusnya adalah XOR'd dengan blok disulitkan sebelumnya untuk menjadikan penyulitan lebih kuat. Bagaimanapun, ini bermakna blok pertama tidak semestinya unik seperti yang lain!

Sekiranya mesej yang disulitkan akan dimulakan sama seperti mesej lain yang akan disulitkan, output yang dienkripsikan akan menjadi sama, dan itu akan memberi seorang penyerang suatu petunjuk untuk mengetahui apakah mesej tersebut. Penyelesaiannya adalah menggunakan vektor permulaan (IV).

Satu IV hanyalah blok bait rawak yang akan XOR'd dengan blok pertama data pengguna. Oleh kerana setiap blok bergantung kepada semua blok yang diproses sehingga titik itu, keseluruhan mesej akan disulitkan mesej yang sama—unik yang disulitkan dengan kunci yang sama tidak akan menghasilkan hasil yang sama. Mari buat buat IV sekarang.

Nota mengenai SecureRandom. Pada versi 4.3 dan ke bawah, Arkitek Cryptography Java mempunyai kelemahan kerana permulaan yang tidak wajar dari penjana nombor pseudorandom yang mendasar (PRNG). Sekiranya anda menyasarkan versi 4.3 dan ke bawah, pembetulan boleh didapati.

Menyulitkan Data

Berbekalkan IvParameterSpec, kita kini boleh melakukan penyulitan sebenar.

Di sini kita lulus dalam rentetan "AES/CBC/PKCS7Padding". Ini menentukan penyulitan AES dengan chaining block chaining. Bahagian terakhir rentetan ini merujuk kepada PKCS7, yang merupakan standard yang ditetapkan untuk data padding yang tidak sesuai dengan sempurna ke dalam saiz blok. (Blok adalah 128 bit, dan padding dilakukan sebelum penyulitan.)

Untuk melengkapkan contoh kami, kami akan meletakkan kod ini dalam kaedah yang menyulitkan yang akan membungkus hasilnya menjadi HashMap yang mengandungi data yang disulitkan, bersama dengan garam dan vektor permulaan yang diperlukan untuk penyahsulitan.

Kaedah Dekripsi

Anda hanya perlu menyimpan IV dan garam dengan data anda. Walaupun garam dan IV dianggap awam, pastikan ia tidak dirancangkan secara bersiri atau digunakan semula. Untuk menyahsulit data, semua yang perlu kita lakukan ialah mengubah mod dalam pembina Cipher dari ENCRYPT_MODE ke DECRYPT_MODE. Kaedah penyahsulitan akan mengambil HashMap yang mengandungi maklumat yang sama yang diperlukan (data yang disulitkan, garam dan IV) dan mengembalikan array byte [] yang disulitkan, diberi kata laluan yang betul. Kaedah penyahsulitan akan menjana semula kunci penyulitan dari kata laluan. Kunci tidak boleh disimpan!

Menguji Enkripsi dan Dekripsi

Untuk memastikan contohnya mudah, kami mengabaikan pemeriksaan ralat yang akan memastikan bahawa HashMap mengandungi kunci yang diperlukan, pasangan nilai. Sekarang kita boleh menguji kaedah kami untuk memastikan data disahsulit dengan betul selepas penyulitan.

Kaedah menggunakan array byte [] sehingga anda boleh menyulitkan data sewenang-wenang bukan hanya objek String.

Menyimpan Data yang Dienkripsi

Sekarang bahawa kita mempunyai array byte [] yang disulitkan, kita boleh menyimpannya untuk penyimpanan.

Sekiranya anda tidak mahu menyimpan IV dan garam secara berasingan, HashMap bersiri dengan kelas ObjectInputStream dan ObjectOutputStream.

Menyimpan Data Selamat kepada SharedPreferences

Anda juga boleh menyimpan data selamat ke SharedPreferences aplikasi anda.

Oleh kerana SharedPreferences adalah sistem XML yang hanya menerima primitif dan objek khusus sebagai nilai, kita perlu menukar data kami ke dalam format yang serasi seperti objek String. Base64 membolehkan kami menukar data mentah ke dalam perwakilan String yang mengandungi hanya aksara yang dibenarkan oleh format XML. Sulitkan kedua-dua kunci dan nilai itu supaya penyerang tidak dapat mengetahui apa nilai yang mungkin untuk. Dalam contoh di atas, disulitkanKey dan disulitkanValue adalah kedua-dua byte [] array yang disulitkan yang dikembalikan dari kaedah encryptBytes () kami. IV dan garam boleh disimpan ke dalam fail pilihan atau sebagai fail berasingan. Untuk mengembalikan bait yang disulitkan dari SharedPreferences, kami boleh memohon decode Base64 pada String yang tersimpan.

Wiping Data Tidak Bersih Daripada Versi Lama

Sekarang bahawa data yang disimpan adalah selamat, mungkin anda mempunyai versi aplikasi sebelum ini yang mempunyai data yang disimpan dengan tidak selamat. Pada peningkatan, data boleh dihapuskan dan disulitkan semula. Kod berikut menyapu fail menggunakan data rawak.

Secara teori, anda hanya boleh memadamkan pilihan kongsi anda dengan membuang /data/data/com.your.package.name/shared_prefs/your_prefs_name.xml dan fail your_prefs_name.bak anda, dan membersihkan pilihan dalam memori dengan kod berikut:

Walau bagaimanapun, daripada cuba menghapus data lama dan berharap ia berfungsi, lebih baik menyulitkannya di tempat pertama! Hal ini terutama berlaku secara umum untuk pemacu keadaan pepejal yang sering menyebarkan data-menulis ke kawasan yang berlainan bagi mengelakkan pakai. Ini bermakna bahawa walaupun anda menulis ganti fail dalam sistem fail, memori keadaan pepejal fizikal mungkin mengekalkan data anda di lokasi asalnya pada cakera.

Kesimpulannya

Itu membungkus tutorial kami untuk menyimpan data yang disulitkan. Dalam siaran ini, anda mengetahui cara menyulitkan dan mendekripsi data sensitif dengan kata laluan yang dibekalkan oleh pengguna. Sangat mudah dilakukan apabila anda tahu bagaimana, tetapi penting untuk mengikuti semua amalan terbaik untuk memastikan data pengguna anda benar-benar selamat.

Dalam jawatan berikutnya, kami akan melihat bagaimana untuk memanfaatkan API Keystore dan lain-lain yang berkaitan dengan kepercayaan untuk menyimpan item dengan selamat. Sementara itu, lihat beberapa artikel hebat kami yang lain mengenai pembangunan aplikasi Android.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.