Tôi sẽ cung cấp một chút khác nhau về điều này.
Tôi luôn lưu trữ muối trộn với hàm băm mật khẩu muối.
Ví dụ, tôi sẽ đặt nửa đầu của muối trước hàm băm của mật khẩu và nửa cuối của muối sau hàm băm của mật khẩu. Ứng dụng nhận thức được thiết kế này vì vậy có thể lấy dữ liệu này và lấy băm mật khẩu muối và muối.
Lý do của tôi cho phương pháp này:
Nếu mật khẩu / dữ liệu băm bị xâm phạm và rơi vào tay kẻ tấn công, kẻ tấn công sẽ không biết muối là gì khi nhìn vào dữ liệu. Bằng cách này, kẻ tấn công thực tế không thể thực hiện một cuộc tấn công vũ phu để có được mật khẩu khớp với hàm băm, vì anh ta không biết bắt đầu băm 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 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 hàm băm mật khẩu muối được lưu trữ nguyên trạng, thì một cuộc tấn công vũ phu có thể được thực hiện để lấy mật khẩu mà khi băm và băm tạo ra dữ liệu giống như băm mật khẩu muối.
Tuy nhiên, ví dụ, ngay cả khi hàm băm mật khẩu đã được lưu trữ nguyên trạng, nhưng được sử dụng trước một byte ngẫu nhiên, miễn là kẻ tấn công không biết rằng byte đầu tiên này sẽ bị loại bỏ, điều này cũng sẽ làm tăng độ khó 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 cho điều này ..
1) Không bao giờ lưu trữ dữ liệu mà ứng dụng xác thực của bạn sử dụng ở dạng 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.
Đi thêm một bước nữa ..
Nếu bạn không thể giữ bí mật logic xác thực của ứng dụng - nhiều người biết cách 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 cùng với muối, với một số muối chuẩn bị băm mật khẩu muối và phần còn lại của muối gắn 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 hàm băm mật khẩu muối.
Ví dụ: bạn tạo một muối ngẫu nhiên 512 byte. Bạn nối muối vào mật khẩu của mình và lấy hàm băm SHA-512 của mật khẩu đã được muối. 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 muối đầu tiên, theo sau là hàm 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ẽ chuyển 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. Vượt qua này sẽ thất bại. Ứ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àm 2 byte đầu tiên của muối và lặp lại cho đến khi tìm thấy kết quả dương tính 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.
Ưu điểm của phương pháp này:
Tăng tính bảo mật - ngay cả khi logic xác thực của bạn được biết đến, logic chính xác không xác định tại thời điểm biên dịch. Thực tế không thể thực hiện một cuộc tấn công vũ phu, ngay cả với kiến thức về logic chính xác. Độ dài của muối sẽ tăng thêm an ninh.
Nhược điểm của phương pháp này:
Vì logic chính xác được suy luận trong thời gian chạy, nên cách tiếp cận này rất tốn CPU. Độ dài của muối càng dài, phương pháp này càng tốn 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 đối với các yêu cầu hợp pháp, nhưng tăng cường bảo mật chống lại những 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 nữa bằng cách sử dụng muối có độ rộng thay đổi và / hoặc băm mật khẩu muối.