Secara umum SharedPreferences adalah pilihan terbaik untuk menyimpan preferensi, jadi secara umum saya akan merekomendasikan pendekatan itu untuk menyimpan pengaturan aplikasi dan pengguna.
Satu-satunya bidang yang menjadi perhatian di sini adalah apa yang Anda tabung. Kata sandi selalu merupakan hal yang sulit untuk disimpan, dan saya akan sangat berhati-hati menyimpannya sebagai teks yang jelas. Arsitektur Android sedemikian rupa sehingga SharedPreferences aplikasi Anda dikosongkan untuk mencegah aplikasi lain mengakses nilai sehingga ada beberapa keamanan di sana, tetapi akses fisik ke ponsel berpotensi memungkinkan akses ke nilai.
Jika mungkin saya akan mempertimbangkan memodifikasi server untuk menggunakan token yang dinegosiasikan untuk menyediakan akses, sesuatu seperti OAuth . Atau Anda mungkin perlu membangun semacam toko kriptografi, meskipun itu tidak sepele. Paling tidak, pastikan Anda mengenkripsi kata sandi sebelum menuliskannya ke disk.
MODE_PRIVATE
dengan SharedPreferences setara dengan melakukan hal yang sama dengan file yang dibuat pada penyimpanan internal, dalam hal efektivitas untuk mengaburkan data yang disimpan secara lokal?Saya setuju dengan Reto dan FIXedd. Secara obyektif itu tidak masuk akal berinvestasi waktu dan usaha yang signifikan dalam mengenkripsi kata sandi di SharedPreferences karena setiap penyerang yang memiliki akses ke file preferensi Anda kemungkinan besar juga memiliki akses ke biner aplikasi Anda, dan karena itu kunci untuk tidak mengenkripsi kode tersebut. kata sandi.
Namun, yang dikatakan, tampaknya ada inisiatif publisitas untuk mengidentifikasi aplikasi seluler yang menyimpan kata sandi mereka dalam teks yang jelas dalam SharedPreferences dan menyorotkan cahaya yang tidak menguntungkan pada aplikasi tersebut. Lihat http://blogs.wsj.com/digits/2011/06/08/some-top-apps-put-data-at-risk/ dan http://viaforensics.com/appwatchdog untuk beberapa contoh.
Meskipun kita perlu lebih banyak perhatian pada keamanan secara umum, saya berpendapat bahwa perhatian semacam ini pada satu masalah khusus ini sebenarnya tidak secara signifikan meningkatkan keamanan keseluruhan kita. Namun, sebagaimana persepsi mereka, inilah solusi untuk mengenkripsi data yang Anda tempatkan di SharedPreferences.
Cukup bungkus objek SharedPreferences Anda sendiri dengan yang ini, dan data apa pun yang Anda baca / tulis akan dienkripsi dan didekripsi secara otomatis. misalnya.
Berikut kode untuk kelas:
sumber
Tentang cara paling sederhana untuk menyimpan satu preferensi dalam Aktivitas Android adalah dengan melakukan sesuatu seperti ini:
Jika Anda khawatir tentang keamanannya, maka Anda selalu dapat mengenkripsi kata sandi sebelum menyimpannya.
sumber
Dengan menggunakan potongan yang disediakan oleh Richard, Anda dapat mengenkripsi kata sandi sebelum menyimpannya. Namun API preferensi tidak menyediakan cara mudah untuk mencegat nilai dan mengenkripsi nilai tersebut - Anda dapat memblokirnya disimpan melalui pendengar OnPreferenceChange, dan Anda secara teoritis dapat memodifikasinya melalui preferensiChangeListener, tetapi itu menghasilkan loop tanpa akhir.
Saya sebelumnya menyarankan menambahkan preferensi "tersembunyi" untuk mencapai ini. Ini jelas bukan cara terbaik. Saya akan menyajikan dua opsi lain yang saya anggap lebih layak.
Pertama, yang paling sederhana, ada di preferChangeListener, Anda bisa mengambil nilai yang dimasukkan, mengenkripsi, dan kemudian menyimpannya ke file preferensi alternatif:
Cara kedua, dan cara yang sekarang saya sukai, adalah membuat preferensi kustom Anda sendiri, memperluas EditTextPreference, @ Mengesampingkan
setText()
dangetText()
metode, sehinggasetText()
mengenkripsi kata sandi, dangetText()
mengembalikan nol.sumber
Baik; sudah lama sejak jawabannya adalah campuran, tapi inilah beberapa jawaban umum. Saya meneliti ini seperti orang gila dan sulit untuk membangun jawaban yang bagus
Metode MODE_PRIVATE dianggap aman secara umum, jika Anda menganggap bahwa pengguna tidak melakukan root pada perangkat. Data Anda disimpan dalam teks biasa di bagian sistem file yang hanya dapat diakses oleh program asli. Membuat ini mengambil kata sandi dengan aplikasi lain pada perangkat yang di-rooting dengan mudah. Kemudian lagi, apakah Anda ingin mendukung perangkat yang di-rooting?
AES masih merupakan enkripsi terbaik yang dapat Anda lakukan. Ingatlah untuk mencari ini jika Anda memulai implementasi baru jika sudah lama sejak saya memposting ini. Masalah terbesar dengan ini adalah "Apa yang harus dilakukan dengan kunci enkripsi?"
Jadi, sekarang kita berada di "Apa yang harus dilakukan dengan kunci?" bagian. Ini bagian yang sulit. Mendapatkan kunci ternyata tidak terlalu buruk. Anda dapat menggunakan fungsi derivasi kunci untuk mengambil kata sandi dan menjadikannya kunci yang cukup aman. Anda masuk ke masalah seperti "berapa banyak pass yang Anda lakukan dengan PKFDF2?", Tapi itu topik lain
Idealnya, Anda menyimpan kunci AES dari perangkat. Anda harus mencari cara yang baik untuk mengambil kunci dari server dengan aman, andal, dan aman sekalipun
Anda memiliki semacam urutan login (bahkan urutan login asli yang Anda lakukan untuk akses jarak jauh). Anda dapat melakukan dua kali menjalankan generator kunci Anda dengan kata sandi yang sama. Cara kerjanya adalah Anda menurunkan kunci dua kali dengan garam baru dan vektor inisialisasi aman baru. Anda menyimpan salah satu kata sandi yang dihasilkan di perangkat, dan Anda menggunakan kata sandi kedua sebagai kunci AES.
Ketika Anda masuk, Anda mendapatkan kembali kunci pada login lokal dan membandingkannya dengan kunci yang disimpan. Setelah selesai, Anda menggunakan kunci turunan # 2 untuk AES.
Anda dapat melakukan banyak variasi dari ini. Misalnya, alih-alih urutan login penuh, Anda dapat melakukan PIN cepat (berasal). PIN cepat mungkin tidak seaman urutan masuk penuh, tetapi berkali-kali lebih aman daripada teks biasa
sumber
Saya tahu ini sedikit necromancy, tetapi Anda harus menggunakan Manajer Akun Android . Ini dibuat khusus untuk skenario ini. Ini sedikit rumit tetapi salah satu hal yang dilakukannya adalah membatalkan kredensial lokal jika kartu SIM berubah, jadi jika seseorang menggesek ponsel Anda dan melempar SIM baru ke dalamnya, kredensial Anda tidak akan terganggu.
Ini juga memberi pengguna cara cepat dan mudah untuk mengakses (dan berpotensi menghapus) kredensial yang disimpan untuk akun apa pun yang mereka miliki di perangkat, semuanya dari satu tempat.
SampleSyncAdapter adalah contoh yang memanfaatkan kredensial akun yang disimpan.
sumber
Saya akan melemparkan topi saya ke atas ring hanya untuk berbicara tentang mengamankan kata sandi secara umum di Android. Pada Android, biner perangkat harus dianggap dikompromikan - ini sama untuk aplikasi akhir mana pun yang berada dalam kendali pengguna langsung. Secara konseptual, seorang hacker dapat menggunakan akses yang diperlukan ke biner untuk mendekompilasi dan membasmi kata sandi terenkripsi Anda dan lain-lain
Karena itu ada dua saran yang ingin saya buang jika keamanan menjadi perhatian utama Anda:
1) Jangan menyimpan kata sandi yang sebenarnya. Simpan token akses yang diberikan dan gunakan token akses dan tanda tangan ponsel untuk mengautentikasi sisi server sesi. Manfaatnya adalah Anda dapat membuat token memiliki durasi terbatas, Anda tidak kompromi kata sandi asli dan Anda memiliki tanda tangan yang baik yang dapat Anda gunakan untuk berkorelasi dengan lalu lintas (misalnya untuk memeriksa upaya intrusi dan membatalkan token rendering itu tidak berguna).
2) Memanfaatkan otentikasi 2 faktor. Ini mungkin lebih menyebalkan dan mengganggu tetapi untuk beberapa situasi kepatuhan tidak dapat dihindari.
sumber
Anda juga dapat memeriksa lib kecil ini, yang berisi fungsionalitas yang Anda sebutkan.
https://github.com/kovmarci86/android-secure-preferences
Ini mirip dengan beberapa pendekatan lain di sini. Semoga membantu :)
sumber
Ini adalah jawaban tambahan bagi mereka yang tiba di sini berdasarkan judul pertanyaan (seperti yang saya lakukan) dan tidak perlu berurusan dengan masalah keamanan terkait dengan menyimpan kata sandi.
Cara menggunakan Preferensi Bersama
Pengaturan pengguna umumnya disimpan secara lokal di Android menggunakan
SharedPreferences
dengan pasangan nilai kunci. Anda menggunakanString
kunci untuk menyimpan atau mencari nilai terkait.Menulis ke Preferensi Bersama
Gunakan
apply()
alih-alihcommit()
menyimpan di latar daripada langsung.Baca dari Preferensi Bersama
Nilai default digunakan jika kunci tidak ditemukan.
Catatan
Daripada menggunakan String kunci lokal di banyak tempat seperti yang saya lakukan di atas, akan lebih baik menggunakan konstanta di satu lokasi. Anda dapat menggunakan sesuatu seperti ini di bagian atas aktivitas pengaturan Anda:
Saya menggunakan
int
dalam contoh saya, tetapi Anda juga dapat menggunakanputString()
,putBoolean()
,getString()
,getBoolean()
, dllLihat dokumentasi untuk lebih jelasnya.
Ada beberapa cara untuk mendapatkan SharedPreferences. Lihat jawaban ini untuk apa yang harus diwaspadai.
sumber
Jawaban ini didasarkan pada pendekatan yang disarankan oleh Mark. Versi kustom dari kelas EditTextPreference dibuat yang mengubah bolak-balik antara teks biasa yang terlihat dalam tampilan dan versi terenkripsi dari kata sandi yang disimpan dalam penyimpanan preferensi.
Seperti yang telah ditunjukkan oleh sebagian besar yang menjawab di utas ini, ini bukan teknik yang sangat aman, meskipun tingkat keamanan sebagian tergantung pada kode enkripsi / dekripsi yang digunakan. Tapi itu cukup sederhana dan nyaman, dan akan menggagalkan pengintaian yang paling kasual.
Berikut adalah kode untuk kelas EditTextPreference kustom:
Ini menunjukkan bagaimana itu dapat digunakan - ini adalah file "item" yang mendorong tampilan preferensi. Perhatikan itu berisi tiga tampilan EditTextPreference biasa dan salah satu tampilan EditPasswordPreference kustom.
Adapun enkripsi / dekripsi aktual, yang tersisa sebagai latihan untuk pembaca. Saat ini saya menggunakan beberapa kode berdasarkan artikel ini http://zenu.wordpress.com/2011/09/21/aes-128bit-cross-platform-java-and-c-encryption-compatibility/ , meskipun dengan nilai yang berbeda untuk kunci dan vektor inisialisasi.
sumber
Pertama-tama saya pikir data Pengguna tidak boleh disimpan di ponsel, dan jika harus menyimpan data di suatu tempat di telepon, data itu harus dienkripsi dengan data pribadi aplikasi. Keamanan kredensial pengguna harus menjadi prioritas aplikasi.
Data sensitif harus disimpan dengan aman atau tidak sama sekali. Jika terjadi infeksi perangkat atau malware yang hilang, data yang disimpan dengan tidak aman dapat dikompromikan.
sumber
Saya menggunakan Android KeyStore untuk mengenkripsi kata sandi menggunakan RSA dalam mode ECB dan kemudian menyimpannya di SharedPreferences.
Ketika saya ingin kata sandi kembali, saya membaca yang dienkripsi dari SharedPreferences dan mendekripsi menggunakan KeyStore.
Dengan metode ini Anda menghasilkan pasangan kunci publik / pribadi di mana kunci pribadi disimpan dan dikelola oleh Android.
Berikut ini tautan tentang cara melakukannya: Tutorial KeyStore Android
sumber
preferensi bersama adalah cara termudah untuk menyimpan data aplikasi kami. tetapi ada kemungkinan bahwa siapa pun dapat menghapus data preferensi bersama kami melalui manajer aplikasi. jadi saya pikir itu tidak sepenuhnya aman untuk aplikasi kita.
sumber
Anda perlu menggunakan sqlite, security apit untuk menyimpan kata sandi. di sini adalah contoh terbaik, yang menyimpan kata sandi, - kata sandi aman. di sini adalah tautan untuk sumber dan penjelasan - http://code.google.com/p/android-passwordsafe/
sumber