bcrypt sinh ra để hash password, khác hẳn SHA-256/MD5 vốn tối ưu cho nhanh: GPU hash SHA-256 được 10 tỷ lần mỗi giây, còn bcrypt cost=12 chỉ chừng 250 lần mỗi giây.
- Adaptive cost factor: mỗi nấc
saltRoundslàm thời gian tăng gấp đôi — cost=10 khoảng 100ms, cost=12 khoảng 400ms, cost=14 khoảng 1,6s. Chọn cost sao cho rơi vào tầm 250ms trên server của bạn, rồi nâng dần theo năm khi phần cứng khoẻ lên. - Salt có sẵn: bcrypt tự sinh salt ngẫu nhiên riêng cho từng password và nhúng luôn vào chuỗi hash — nhờ vậy rainbow table vô dụng, và cùng một password hash hai lần vẫn ra hai chuỗi khác nhau.
- Timing attack:
bcrypt.compare()so sánh theo thời gian hằng định; đừng bao giờ so hash bằng===.
Argon2 là lựa chọn hiện đại hơn (thắng Password Hashing Competition 2015): argon2id kháng GPU lẫn side-channel tốt hơn và được OWASP khuyến nghị từ 2023 — trong Node.js dùng package argon2.
Lưu ý: hash password ở service layer chứ đừng đặt trong model hook — hook chạy lại khi update field khác là dính double-hash, user không đăng nhập được nữa.