Menurut percakapan di komentar, yang Anda maksud adalah hashing sandi, bukan mengenkripsi kata sandi. Anda biasanya akan melakukan ini dengan garam untuk mencegah serangan tabel pelangi. Menyimpan sandi sebagai hash asin adalah standar praktik terbaik dalam hal menyimpan sandi dalam database.
Pada versi 3.2, MongoDB tidak memiliki dukungan asli untuk hashing kata sandi seperti yang disediakan beberapa database SQL, jadi Anda harus mengimplementasikannya di Java.
Untuk membuat akun baru atau mengubah kata sandi akun yang ada:
- buat nilai garam acak yang aman secara kriptografis dengan
java.security.SecureRandom
. Kelas ini bekerja seperti generator angka acak standarjava.util.Random
(ini adalah subkelas) tetapi memperdagangkan kinerja untuk tingkat non-prediktabilitas yang jauh lebih tinggi yang diperlukan untuk konteks yang relevan dengan keamanan. - Buat string dengan menggabungkan garam dan sandi
- Hasilkan hash dari string tersebut dengan fungsi hash yang aman secara kriptografis. Ada banyak fungsi hash yang disediakan oleh Java di luar kotak, tetapi Anda ingin menggunakan salah satu yang sengaja sulit dihitung untuk memperlambat penyerang dengan akses database yang mencoba memaksa hash Anda di cluster superkomputer lokal mereka. Kandidat yang baik adalah algoritme "PBKDF2WithHmacSHA1" yang didukung oleh
javax.crypto.SecretKeyFactory
kelas. - Simpan dokumen ke MongoDB dengan kolom
username
,password_hash
danpassword_salt
(ditambah data aplikasi Anda yang sebenarnya, tentu saja). Jangan simpan sandi asli.
Untuk mengambil akun:
- Baca
username_input
danpassword_input
pengguna yang diduga masuk ke formulir login Anda. - Ambil dokumen tempat
username
cocok denganusername_input
yang diberikan pengguna. - Dapatkan
password_salt
bidang dari dokumen itu - Buat string dengan menggabungkan
password_salt
danpassword_input
seperti yang Anda lakukan sebelumnya. - Buat hash dari string tersebut dengan fungsi hash yang aman secara kriptografis yang sama.
- Bandingkan hash dengan
password_hash
bidang dokumen. Jika cocok, pengguna memasukkan sandi yang benar.
Sebagai alternatif, Anda hanya dapat mengambil bidang password_hash dan password_salt dari dokumen dan tidak memuat sisanya sebelum pengguna diautentikasi, tetapi saya akan berasumsi bahwa di dunia nyata itu akan menyebabkan lebih banyak beban daripada yang akan dihemat. Login yang berhasil biasanya akan jauh lebih banyak daripada yang gagal, kecuali jika Anda memiliki penyerang yang mencoba untuk memaksa akun. Dan dalam hal ini Anda akan memblokir penyerang dengan fail2ban atau mekanisme pembatasan login lainnya.