Họ đang đo gì
Bạn có biết vì sao hàm băm nhanh lại sai chỗ này không — đây là kiến thức bảo mật nền tảng nhất.
Trả lời ngắn~30 giây
Dùng Argon2id, bcrypt hoặc scrypt, với muối riêng cho từng mật khẩu (các thư viện này tự sinh và tự nhúng vào chuỗi kết quả). Không dùng MD5, SHA-1 hay SHA-256 — chúng được thiết kế để NHANH, mà nhanh nghĩa là GPU thử được hàng tỷ mật khẩu mỗi giây. Hàm băm mật khẩu cố tình tốn thời gian và bộ nhớ để biến việc dò tìm hàng loạt thành không khả thi về kinh tế.
Giải thích sâu
Muối chống lại rainbow table: không có muối thì mọi người dùng có cùng mật khẩu sẽ có cùng hash, nên kẻ tấn công phá một lần là ra tất cả. Muối phải NGẪU NHIÊN và khác nhau cho từng bản ghi — dùng chung một muối cho cả hệ thống là quay lại đúng vấn đề đó. Điểm hay là bcrypt và Argon2 đều tự lo phần này, nên tự cài đặt muối thường là dấu hiệu bạn đang tự viết thứ không nên tự viết.
Tham số chi phí cần được xem lại định kỳ vì phần cứng nhanh dần. OWASP đưa ra khuyến nghị cụ thể theo từng thuật toán và cập nhật theo thời gian; nguyên tắc thực dụng là chọn mức khiến một lần băm mất khoảng 250–500ms trên phần cứng production của bạn. Và khi nâng chi phí, bạn nâng cho mật khẩu mới rồi băm lại dần khi người dùng đăng nhập — không cần bắt ai đổi mật khẩu.
Hai chi tiết nhỏ mà hay bị bỏ: so sánh hash phải dùng hàm so sánh thời gian hằng định (thư viện đã lo), và thông báo lỗi đăng nhập phải giống hệt nhau cho “email không tồn tại” và “sai mật khẩu” — nếu không, bạn vừa tặng kẻ tấn công một công cụ liệt kê tài khoản. Thời gian phản hồi cũng phải tương đương, nên đường sai email vẫn nên chạy một phép băm giả.
Câu hỏi tiếp theo họ sẽ hỏi
?Pepper là gì và có cần không?
Một bí mật chung của toàn hệ thống, trộn thêm vào ngoài muối và lưu TÁCH KHỎI database (biến môi trường, HSM). Nó có ích khi database bị rò rỉ mà khoá không bị: hash trở nên vô dụng với kẻ tấn công. Đổi lại việc xoay vòng pepper rất phiền, nên nó là bước nâng cao chứ không phải bắt buộc.
?Yêu cầu độ phức tạp mật khẩu thế nào?
Hướng dẫn hiện nay (NIST SP 800-63B) nghiêng về độ DÀI tối thiểu và đối chiếu với danh sách mật khẩu đã lộ, thay vì bắt buộc ký tự đặc biệt và bắt đổi định kỳ — hai quy tắc cũ đó khiến người dùng chọn Password1! rồi thành Password2!. Đừng đặt giới hạn độ dài tối đa thấp, và đừng cấm dán từ trình quản lý mật khẩu.
Trả lời thế này là mất điểm
- “SHA-256 với muối là đủ.” Muối chặn rainbow table nhưng không làm chậm việc dò — GPU vẫn thử hàng tỷ lần mỗi giây.
- Tự cài đặt thuật toán băm mật khẩu. Đây là lĩnh vực mà tự viết gần như luôn tệ hơn thư viện.