Apakah saya perlu menyimpan garam dengan bcrypt?

189

javadoc bCrypt memiliki kode ini untuk cara mengenkripsi kata sandi:

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); 

Untuk memeriksa apakah kata sandi plaintext cocok dengan yang telah di hash sebelumnya, gunakan metode checkpw:

if (BCrypt.checkpw(candidate_password, stored_hash))
    System.out.println("It matches");
else
    System.out.println("It does not match");

Cuplikan kode ini menyiratkan kepada saya bahwa garam yang dihasilkan secara acak dibuang. Apakah ini masalahnya, atau ini hanya cuplikan kode yang menyesatkan?

RodeoClown
sumber

Jawaban:

214

Garam dimasukkan ke dalam hash (dikodekan dalam format gaya base64).

Misalnya, dalam kata sandi Unix tradisional, garam disimpan sebagai dua karakter kata sandi pertama. Karakter yang tersisa mewakili nilai hash. Fungsi pemeriksa tahu ini, dan menarik hash terpisah untuk mendapatkan garam kembali.

Greg Hewgill
sumber
59
Garam IS dimasukkan dalam kata sandi. Jadi, Anda tidak harus menyimpan garam.
Swapnonil Mukherjee
2
Terima kasih untuk itu. Saya berharap mereka mengatakan itu di javadoc :) (Saya telah melihat sumbernya dan mengkonfirmasi - tapi saya tidak tahu apa yang saya cari sebelumnya)
RodeoClown
1
Terima kasih - saya juga mencoba mencari tahu! Sekarang saya bertanya-tanya apakah ini ide yang bagus. Apakah ada untung / ruginya menyimpan garam di dalam hash dibandingkan menyimpannya secara terpisah?
Adam
8
@ Adam - Karena garam dibuat secara acak, artinya Anda tidak perlu memiliki metode untuk mengaitkan dua hal dalam basis data Anda.
RodeoClown
Saya melihat kode sumber dan menemukan bahwa meskipun JavaDoc untuk argumen garam "mungkin dihasilkan menggunakan BCrypt.gensalt", saya menemukan bahwa Anda harus menggunakan metode genSalt () atau Anda mendapatkan pengecualian = /
the_new_mr