Tôi sẽ cung cấp một chút khác biệt về điều này.
Tôi luôn lưu trữ muối được trộn lẫn với hàm băm được mã hóa bằng muối.
Ví dụ, tôi sẽ đặt nửa đầu của muối trước khi băm muối của mật khẩu, và nửa cuối của muối sau khi băm muối của mật khẩu. Ứng dụng này nhận thức được thiết kế này để có thể tìm nạp dữ liệu này và lấy hàm băm muối và mật khẩu muối.
lý do của tôi cho cách tiếp cận này:
Nếu dữ liệu mật khẩu/băm bị tổn thương và rơi vào tay của kẻ tấn công, kẻ tấn công sẽ không biết những gì muối là từ nhìn vào dữ liệu. Bằng cách này, kẻ tấn công không thể thực hiện tấn công brute-force để lấy mật khẩu khớp với băm, vì anh ta không biết băm để bắt đầu và không có cách nào để biết phần nào của dữ liệu là một phần của muối, hoặc các phần của hàm băm có mật khẩu muối (trừ khi anh ta biết logic xác thực của ứng dụng của bạn).
Nếu băm mật khẩu muối được lưu trữ dưới dạng, thì có thể thực hiện một cuộc tấn công brute-force để lấy mật khẩu khi muối và băm tạo ra cùng một dữ liệu như băm mật khẩu muối.
Tuy nhiên, ví dụ, ngay cả khi băm mật khẩu muối được lưu trữ dưới dạng, nhưng tiền được kích hoạt bằng một byte ngẫu nhiên duy nhất, miễn là kẻ tấn công không biết rằng byte đầu tiên này sẽ bị hủy. cũng làm tăng khó khăn của cuộc tấn công. Ứng dụng của bạn sẽ biết loại bỏ byte đầu tiên của dữ liệu khi được sử dụng để xác thực người dùng của bạn.
Kết luận này ..
1) Không bao giờ lưu trữ các dữ liệu mà ứng dụng xác thực của bạn sử dụng trong đó là hình thức chính xác.
2) Nếu có thể, hãy giữ bí mật logic xác thực của bạn để tăng cường bảo mật.
Go thêm một bước nữa ..
Nếu bạn không thể giữ bí mật xác thực logic của ứng dụng của bạn - rất nhiều người biết làm thế nào dữ liệu của bạn được lưu trữ trong cơ sở dữ liệu. Và giả sử bạn đã quyết định để lưu trữ băm mật khẩu muối trộn lẫn với muối, với một số muối prepending các băm mật khẩu muối, và phần còn lại của muối thêm nó.
Khi tạo muối ngẫu nhiên, bạn cũng có thể quyết định ngẫu nhiên tỷ lệ muối bạn sẽ lưu trữ trước/sau khi băm mật khẩu muối.
Ví dụ: bạn tạo một muối ngẫu nhiên là 512 byte. Bạn thêm muối vào mật khẩu của bạn, và lấy mã băm SHA-512 của mật khẩu muối của bạn. Bạn cũng tạo ra một số nguyên ngẫu nhiên 200. Sau đó bạn lưu trữ 200 byte đầu tiên của muối, tiếp theo là băm mật khẩu muối, tiếp theo là phần còn lại của muối.
Khi xác thực nhập mật khẩu của người dùng, ứng dụng của bạn sẽ vượt qua chuỗi và giả sử 1 byte đầu tiên của dữ liệu là 1 byte đầu tiên của muối, tiếp theo là hàm băm muối. Vé này sẽ không thành công. Ứng dụng sẽ tiếp tục bằng cách sử dụng 2 byte đầu tiên của dữ liệu là 2 byte đầu tiên của muối và lặp lại cho đến khi kết quả tích cực được tìm thấy sau khi sử dụng 200 byte đầu tiên làm 200 byte đầu tiên của muối. Nếu mật khẩu sai, ứng dụng sẽ tiếp tục thử tất cả các hoán vị cho đến khi không tìm thấy.
Các ưu điểm của phương pháp này:
Tăng an ninh - ngay cả nếu logic xác thực của bạn được biết đến, logic chính xác là chưa có thời gian biên dịch. Nó là thực tế không thể thực hiện một cuộc tấn công brute-force, ngay cả với kiến thức về logic chính xác. Tăng độ dài của muối sẽ tăng cường an ninh hơn nữa.
Các nhược điểm của phương pháp này:
Kể từ logic chính xác được suy ra tại thời gian chạy, phương pháp này là rất CPU-chuyên sâu. Độ dài của muối càng dài thì phương pháp tiếp cận này càng nhiều CPU.
Xác thực mật khẩu không chính xác sẽ liên quan đến chi phí CPU cao nhất. Điều này có thể phản tác dụng với các yêu cầu hợp pháp, nhưng tăng cường an ninh chống lại kẻ tấn công.
Cách tiếp cận này có thể được thực hiện theo nhiều cách khác nhau và có thể được thực hiện an toàn hơn bằng cách sử dụng các muối có độ rộng biến đổi và/hoặc băm mật khẩu.
Nếu có nơi bạn có thể lưu trữ muối mà kẻ tấn công không thể nhận được, thì bạn cũng nên lưu trữ mật khẩu ở đó. Nhưng tại sao không sử dụng một loại muối khác nhau cho mỗi mật khẩu? – jrockway
Anh ấy đang sử dụng một loại muối khác nhau cho mỗi mật khẩu, jrockway. – Amber
Muối của bạn lớn đến mức nào? Các muối của bạn phải đủ lớn (32 bit?) Mà thực tế không có khả năng là một chiếc bàn cầu vồng đã được precomputed cho nó. –