CategoriesAndroidProgrammingSecurity

Mengamankan SharedPreferences pada Aplikasi Android

SharedPreferences merupakan penyimpanan key-value data sederhana pada Android. SharedPreferences seringkali digunakan untuk menyimpan setting pada aplikasi, sering juga digunakan sebagai session yang menyimpan info login yang memuat token user untuk login padahal sebenarnya menyimpan data penting seperti user token di SharedPreferences merupakan hal yang fatal dan bisa menyebabkan system di bobol oleh hacker karena SharedPreferences bisa diakses dan dibaca oleh user yang memiliki akses root pada devicenya.

Lalu bagaimana cara mengamankan SharedPreferences agar tidak mudah diakses oleh user ? caranya adalah dengan meng enkripsi SharedPreferences tersebut. Android Jetpack menyediakan satu security library untuk memenuhi kebutuhan ini, nama library ini adalah EncryptedSharedPreferences.

Apa itu EncryptedSharedPreferences ?
singkatnya, EncryptedSharedPreferences adalah SharedPreferences yang di enkripsi agar tidak mudah dibaca oleh user yang tidak dikehendaki. yang dienkripsi disini adalah key dan value nya, key dienkripsi dengan algoritma enkripsi deterministik dan value nya diekripsi menggunakan AES-256 GCM yang bersifat deterministik. agar dapat lebih mudah memahaminya kita praktekkan cara penerapannya.

Praktek

EncryptedSharedPreferences hanya bisa digunakan di Android API 23 (Marshmallow) keatas, jadi pastikan minimum sdk version dari aplikasi kalian adalah Android Marshmallow.

tambahkan library security pada build.gradle (app) kalian

implementation "androidx.security:security-crypto:1.1.0-alpha03"

lalu buat satu class helper untuk mengakses SharedPreferences. disini kita buat 2 function untuk mendapatkan SharedPreferences tanpa enkripsi dan dengan enkripsi untuk perbandingan.

pada EncryptedSharedPreferences.create terdapat 5 parameter. diantaranya adalah parameter untuk context, nama file SharedPreferences, Master Key, skema enkripsi untuk key, dan skema enkripsi untuk value.

buat layout untuk main_activity

buat satu Activity baru untuk menampilkan data dari SharedPreferences. beri nama ShowPrefActivity.

sebelum menambahkan logic untuk UI nya, kita aktifkan dulu viewBinding untuk mempermudah dalam memanipulasi UI. tambahkan konfigurasinya di build.gradle (app)

android {
...
  viewBinding {
      enabled = true
  }
}

lalu isi MainActivity dengan kode sebagai berikut

untuk ShowPrefActivity isikan dengan kode sebagai berikut :

setelah itu kita coba run, maka tampilan awal akan menjadi seperti ini

coba isikan Kong pada EditText, lalu klik Simpan Biasa (untuk menyimpan ke SharedPreferences tanpa Enkripsi)

lalu isikan Godzilla dan klik Simpan Ekripsi (untuk menyimpan ke EncryptedSharedPreferences)

sekarang kita coba lihat file SharedPreferences di device kita menggunakan Device File Explorer pada Android Studio (ada di bagian kanan android studio). lalu pergi ke folder data/data/[nama package aplikasi anda]/shared_prefs. disitu kita akan menemukan file session.xml yang merupakan file dari SharedPreferences kita. coba buka. maka file tersebut akan berisikan text seperti berikut

disitu kita bisa melihat perbedaan dari data yang terenkripsi dan data yang di enkripsi. selain data nya, keyset nya pun juga dienkripsi menggunakan keystore kita sehingga bisa dibilang cukup aman. hacker butuh keystore kita untuk bisa meng decrypt keyset tersebut, karena itu disini keamanan dari keystore juga diperlukan.

lalu apakah hasil getString dari SharedPreferences akan berupa String yang terenkripsi ? tentu saja tidak, kita coba klik button Ke Activity Lain.

String yang ter enkripsi akan otomatis di decrypt untuk mendapatkan data aslinya.

Cukup mudah bukan ? dengan EncryptedSharedPreferences kita bisa mengamankan data yang tersimpan di SharedPreferences tanpa khawatir di intip oleh hacker.

untuk melihat Source Code lengkap dari Artikel ini, bisa menuju link dibawah ini

https://github.com/asyarialmuslimin/demo-secure-prefs

Published by Ahmad Saifur Ridlo

Android Developer at Algostudio.net

Leave a Reply

Your email address will not be published. Required fields are marked *