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.SecretKeyFactorykelas. - Simpan dokumen ke MongoDB dengan kolom
username,password_hashdanpassword_salt(ditambah data aplikasi Anda yang sebenarnya, tentu saja). Jangan simpan sandi asli.
Untuk mengambil akun:
- Baca
username_inputdanpassword_inputpengguna yang diduga masuk ke formulir login Anda. - Ambil dokumen tempat
usernamecocok denganusername_inputyang diberikan pengguna. - Dapatkan
password_saltbidang dari dokumen itu - Buat string dengan menggabungkan
password_saltdanpassword_inputseperti yang Anda lakukan sebelumnya. - Buat hash dari string tersebut dengan fungsi hash yang aman secara kriptografis yang sama.
- Bandingkan hash dengan
password_hashbidang 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.