Dùng hàm băm mật khẩu chuyên dụng, chậm có chủ đích: Argon2id (khuyến nghị đầu tiên), hoặc bcrypt/scrypt khi hạ tầng chưa hỗ trợ Argon2. Không tự chế thuật toán.
Vì sao không SHA-256: nó được thiết kế để nhanh. GPU băm SHA-256 ở mức hàng tỷ phép/giây, nên khi DB rò rỉ, kẻ tấn công dò từ điển và mật khẩu phổ biến gần như tức thời. Các hàm băm mật khẩu cố tình tốn thời gian và bộ nhớ (Argon2 có tham số memory cost) để mỗi lần thử tốn gấp hàng triệu lần, làm việc dò tốn kém tới mức không đáng để làm.
Salt — chuỗi ngẫu nhiên duy nhất cho mỗi user, khiến hai user cùng mật khẩu ra hai hash khác nhau và vô hiệu hoá rainbow table. Argon2/bcrypt tự sinh salt và nhúng vào chuỗi kết quả, không cần cột riêng:
$argon2id$v=19$m=19456,t=2,p=1$c29tZXNhbHQ$hash...Những điểm nên nói thêm:
- So sánh bằng hàm
verifycủa thư viện (so sánh constant-time), không dùng==trên chuỗi hash. - bcrypt giới hạn 72 byte đầu vào — mật khẩu dài hơn bị cắt âm thầm; đây là gotcha hay được hỏi.
- Đặt độ dài tối thiểu (8–12 ký tự) và đối chiếu danh sách mật khẩu đã lộ, thay vì ép quy tắc ký tự đặc biệt rườm rà.
- Khi nâng tham số cost, rehash khi user đăng nhập thành công (lúc đó mới có mật khẩu thô).