Tôi có cần lưu trữ muối với bcrypt không?


189

javadoc của bCrypt có mã này để biết cách mã hóa mật khẩu:

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

Để kiểm tra xem mật khẩu văn bản gốc có khớp với mật khẩu đã được băm trước đó hay không, hãy sử dụng phương thức checkpw:

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

Các đoạn mã này ngụ ý với tôi rằng muối được tạo ngẫu nhiên bị vứt đi. Đây có phải là trường hợp, hay đây chỉ là một đoạn mã sai lệch?

Câu trả lời:


214

Muối được kết hợp vào hàm băm (được mã hóa theo định dạng cơ sở64).

Ví dụ, trong mật khẩu Unix truyền thống, muối được lưu trữ dưới dạng hai ký tự đầu tiên của mật khẩu. Các ký tự còn lại đại diện cho giá trị băm. Hàm checker biết điều này và kéo băm ra để lấy muối ra.


59
Muối IS được kết hợp trong mật khẩu. Vì vậy, bạn không phải tiết kiệm muối.
Swapnonil Mukherjee

2
Cảm ơn vì điều đó. Tôi ước họ nói điều đó trong javadoc :) (Tôi đã xem nguồn và xác nhận - nhưng tôi không biết những gì tôi đang tìm kiếm trước đó)
RodeoClown

1
Cảm ơn - Tôi đã cố gắng để tìm ra điều này quá! Bây giờ tôi đang tự hỏi nếu đây là một ý tưởng tốt. Có một lợi thế / bất lợi để giữ muối trong hàm băm hơn là lưu trữ riêng biệt không?
Adam

8
@Adam - Vì muối được tạo ngẫu nhiên, điều đó có nghĩa là bạn không cần phải có phương pháp liên kết hai thứ trong cơ sở dữ liệu của mình.
RodeoClown

Tôi đã xem mã nguồn và phát hiện ra rằng mặc dù JavaDoc cho đối số muối là "có thể được tạo bằng BCrypt.gensalt", tôi thấy rằng bạn phải sử dụng phương thức genSalt () hoặc bạn có ngoại lệ = /
the_new_mr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.