Cả bcrypt và Argon2 đều là password hashing function được thiết kế để chậm — ngược hẳn SHA-256/MD5 vốn tối ưu cho nhanh.
bcrypt: đã đứng vững từ 1999, độ khó chỉnh bằng cost factor (saltRounds) và tăng theo hàm mũ — bcrypt.hash(password, 12).
Argon2: vô địch Password Hashing Competition 2015, có ba biến thể — argon2d (chống GPU), argon2i (chống side-channel), argon2id (cả hai, và là bản nên dùng). Tham số gồm memory-cost, time-cost và parallelism.
So sánh:
- argon2id chống tấn công GPU lẫn side-channel tốt hơn bcrypt. OWASP Password Storage Cheat Sheet đặt mức tối thiểu cho argon2id là m=19MiB, t=2, p=1; còn 64MB/t=3 là mặc định theo RFC 9106 mà các thư viện hay dùng.
- bcrypt cắt cụt input ở 72 byte — mật khẩu dài hơn bị mất phần đuôi, đây là điểm yếu thật sự. argon2 không có giới hạn này.
- Chốt lại: argon2id là best practice hiện nay, nhưng bcrypt vẫn an toàn nếu cost đủ cao và không có mật khẩu dài quá 72 byte.
Migration không downtime: khi user đăng nhập thì verify bằng bcrypt, rehash bằng argon2id rồi lưu hash mới — hash cũ tự chết dần theo lượt đăng nhập.
Lưu ý: bcrypt.hash(password, 10) trong test CI sẽ làm test chậm thấy rõ — dùng cost thấp nhất bcrypt cho phép (4), hoặc mock hẳn trong unit test.