Ba loại hash, và hai loại sai
Hash mật khẩu là một trong ít chỗ trong bảo mật ứng dụng có câu trả lời dứt khoát. Không có đánh đổi kiến trúc, không phụ thuộc ngữ cảnh: có ba lựa chọn đúng và mọi thứ khác là sai.
Điều làm nhiều người chọn sai là hai chữ "hash" mang hai nghĩa hoàn toàn khác nhau:
| Loại | Ví dụ | Thiết kế để | Dùng cho mật khẩu? |
|---|---|---|---|
| Hash mật mã đa dụng | SHA-256, SHA-3, BLAKE3 | Nhanh | Không |
| MAC | HMAC-SHA256 | Xác thực tính toàn vẹn | Không |
| Hash mật khẩu | Argon2id, scrypt, bcrypt | Chậm và tốn bộ nhớ | Có |
SHA-256 không "yếu" — nó là một hàm hash rất tốt cho việc nó được thiết kế để làm. Vấn đề là nó nhanh, và nhanh là điều tệ nhất có thể với mật khẩu: một GPU hiện đại thử được hàng tỉ SHA-256 mỗi giây, nên một mật khẩu 8 ký tự đã hash bằng SHA-256 bị dò xong trong vài giờ dù có salt.
Salt giải quyết một bài toán khác và nó thường bị hiểu là giải quyết bài toán này. Salt chặn rainbow table và chặn việc hai người dùng cùng mật khẩu có cùng hash — nó không làm việc dò một mật khẩu cụ thể chậm hơn. Đó là việc của work factor.
Tham số nên dùng, theo OWASP Password Storage Cheat Sheet:
| Thuật toán | Tham số |
|---|---|
| Argon2id (ưu tiên) | m=19 MiB, t=2, p=1 — hoặc m=47 MiB, t=1, p=1 |
| scrypt | N=2^17, r=8, p=1 |
| bcrypt | cost ≥ 10, và chú ý giới hạn 72 byte |
Cái bẫy của bcrypt đáng biết: nó âm thầm bỏ mọi byte sau byte thứ 72. Với một passphrase dài hoặc một mật khẩu tiếng Việt có dấu (mỗi ký tự 2–3 byte UTF-8), phần cuối bị bỏ mà không báo gì.
Nhưng câu hỏi tốt hơn cả ba dòng trên là: có cần mật khẩu không? Không lưu mật khẩu thì không có gì để lộ, không có gì để hash sai, và không có ai dùng lại mật khẩu của họ từ một site đã bị lộ. Passkey (WebAuthn) và OIDC với một provider đều bỏ hẳn bài toán này thay vì giải nó.
Bình luận
Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.
Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.
Đang tải bình luận…