Salt là một chuỗi ngẫu nhiên, duy nhất cho từng bản ghi mật khẩu, được trộn vào trước khi hash và lưu công khai cùng hash trong DB.
Vì sao cần salt riêng cho mỗi user:
- Hai user đặt trùng mật khẩu sẽ ra hai hash khác nhau → nhìn DB không suy ra được ai trùng mật khẩu ai.
- Vô hiệu hoá rainbow table và bảng tra dựng sẵn: kẻ tấn công phải bẻ từng hash một, không tái sử dụng công sức.
Pepper là một khoá bí mật dùng chung cho cả hệ thống, KHÔNG lưu trong DB mà nằm ở nơi tách biệt (biến môi trường, HSM, secret manager). Cách áp dụng đúng là HMAC mật khẩu bằng pepper rồi mới đưa vào hàm hash, hoặc mã hoá hash bằng khoá đó.
| Salt | Pepper | |
|---|---|---|
| Phạm vi | Mỗi mật khẩu một cái | Toàn hệ thống |
| Lưu ở đâu | Cùng DB với hash | Ngoài DB (secret store) |
| Chống gì | Rainbow table, hash trùng | DB bị lộ nhưng secret store thì không |
Các thư viện bcrypt/Argon2 đã tự sinh salt và nhúng vào chuỗi hash — không cần tự quản. Pepper là lớp phòng thủ tuỳ chọn, chỉ có giá trị khi khoá thực sự nằm ngoài phạm vi rò rỉ của DB.