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 lên hàng triệu lần, làm việc dò trở nên bất khả thi về chi phí.
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 hóa 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 hằng thời gian), 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ô).