FresherKỹ thuậtXác thực & bảo mật
Backend nên lưu mật khẩu người dùng như thế nào?
Thử trả lời trước
Đáp án mẫu
Không bao giờ lưu chính mật khẩu. Hãy lưu kết quả của một hash mật khẩu chậm, có salt, để database bị đánh cắp cũng không giao mật khẩu cho kẻ tấn công.
Vì sao các lựa chọn đơn giản hơn đều thất bại:
- Plain text hoặc mã hóa đảo ngược được: một lần rò rỉ hoặc mất một key là lộ tất cả mọi người.
- Hash nhanh như MD5 hay SHA-256: một GPU thử hàng tỷ lần đoán mỗi giây, và rainbow table tính sẵn hoạt động khi không có salt.
Thay vào đó hãy làm:
- Dùng argon2id, hoặc bcrypt hay scrypt khi chưa có argon2. Chúng cố tình chậm và tốn bộ nhớ, với tham số cost mà bạn tăng dần theo thời gian.
- Dùng salt ngẫu nhiên riêng cho mỗi mật khẩu, để hai mật khẩu giống nhau cho hash khác nhau. Thư viện hiện đại tự sinh salt và nhúng vào chuỗi hash.
- Kiểm tra bằng hàm so sánh của thư viện, chạy theo constant time.
- Cho người dùng chọn passphrase dài, kiểm tra mật khẩu mới với danh sách bị lộ, và bỏ các quy tắc ký tự tùy tiện.
- Thêm MFA, vì hash tốt cũng không cứu được mật khẩu yếu hoặc dùng lại.
Điều cần nhớ: dùng thư viện còn được bảo trì, để nó lo salt và tham số, và đừng bao giờ tự phát minh cơ chế riêng.
Ý chính
- Lưu hash chậm có salt, không lưu mật khẩu
- Ưu tiên argon2id, bcrypt hoặc scrypt là phương án thay thế
- Salt riêng cho mỗi mật khẩu vô hiệu hóa rainbow table
- Dùng thư viện và thêm MFA
Câu hỏi nối tiếp thường gặp
- Salt và pepper khác nhau thế nào?
- Làm sao tăng tham số cost về sau?
Lỗi thường gặp
- Dùng SHA-256 hoặc MD5 cho mật khẩu
- Dùng một salt chung cho mọi người dùng