← [ BACK_TO_NOTES ]

Password Salt vs Pepper

Salt 是每个 password verifier 独立的公开随机值,用于阻断预计算和跨账号复用;Pepper 是与数据库分离保存的服务器秘密,用于在 hash database 泄漏后增加离线猜测成本,两者职责不能互换。

#synthesis #evergreen #auth #crypto

[!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 思路接近。

学习检查

  1. Salt 和 Pepper 最核心的差异是什么?
  2. 为什么 attacker 知道 salt 并不代表 salt 失效?
  3. 为什么每个账号使用独立 salt?
  4. Pepper 为什么应该和 password database 分开存储?
  5. Pepper rotation 为什么比 salt rotation 困难?
  6. Salt 与 AEAD nonce/IV 为什么不是同一个概念?
  7. Username 为什么不应该机械替代随机 salt?
创建于 2026/9/30 更新于 2026/9/30
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本