Password Salt vs Pepper
Salt 是每个 password verifier 独立的公开随机值,用于阻断预计算和跨账号复用;Pepper 是与数据库分离保存的服务器秘密,用于在 hash database 泄漏后增加离线猜测成本,两者职责不能互换。
[!info] related notes
Password Salt vs Pepper
一句话关系
Salt:
unique per password verifier + public
Pepper:
shared or scoped server secret + secret
两者都可以参与 password protection,但解决的是不同问题。
Salt
Salt 的目标:
password + salt → password-hashing scheme → verifier
每个账号应使用不同 salt。
攻击者拿到数据库时通常会同时拿到 salt,这完全符合设计预期。
Salt 主要阻止:
- rainbow table;
- 预计算;
- 同 password 跨用户产生同 verifier;
- 一次 guess 结果跨所有账号直接复用。
为什么 Salt 不需要 Secret
Salt 的安全价值来自:
uniqueness / randomness
而不是 secrecy。
数据库可存:
algorithm parameters salt hash
攻击者知道 salt 后仍然必须针对对应 verifier 逐个做昂贵 password guess。
Pepper
Pepper 是额外 secret。
典型:
password → password hashing → keyed post-processing / pepper-aware construction
或使用目标 library/架构明确支持的 secret parameter。
Pepper 应保存在 password database 之外,例如:
- HSM;
- KMS;
- TEE;
- secret manager。
Pepper 的价值
如果:
database dump leaked + pepper not leaked
攻击者无法仅靠 database 离线验证 password guesses。
所以 pepper 属于 defense in depth。
Pepper 的代价
Pepper 是真正的 secret,因此引入:
- secret distribution;
- availability;
- rotation;
- disaster recovery;
- HSM/KMS dependency。
Pepper 丢失可能导致 verifier 无法正常工作。
因此 pepper 不是所有系统都必须引入。
Rotation
Salt 不需要集中 rotation。
Pepper rotation 更复杂。
如果 verifier 设计依赖 pepper,通常不能仅靠数据库中现有 hash 在不知道 password 的情况下随意换 pepper。
实际策略可能包括:
- versioned pepper;
- successful-login migration;
- incident-driven password reset。
必须提前设计。
Salt vs IV / Nonce
不要因为都“可以公开”就把它们混起来。
Salt:
- password hashing;
- 防预计算 / verifier collision。
IV/nonce:
- encryption/AEAD mode;
- 控制 keystream/chaining uniqueness。
用途完全不同。
Salt vs Username
Username 可能 unique,但通常不是理想 salt:
- 可预测;
- 可复用;
- 可能变化;
- 跨系统相同。
使用 cryptographically random salt 更清晰。
NIST 的额外 Keyed Step
NIST SP 800-63B-4 建议 verifier 可执行额外 keyed hashing/encryption step,并要求该 secret 独立于 password hashes 存储,最好位于硬件保护环境。
这与工程里常说的 pepper 思路接近。
学习检查
- Salt 和 Pepper 最核心的差异是什么?
- 为什么 attacker 知道 salt 并不代表 salt 失效?
- 为什么每个账号使用独立 salt?
- Pepper 为什么应该和 password database 分开存储?
- Pepper rotation 为什么比 salt rotation 困难?
- Salt 与 AEAD nonce/IV 为什么不是同一个概念?
- Username 为什么不应该机械替代随机 salt?