跳转到主要内容

盐值

本文约需 2 分钟阅读

盐 (Salt) 是指对密码进行哈希处理时附加的随机数据。即使是相同的密码,只要盐不同就会生成不同的哈希值,因此可以使彩虹表攻击和预计算攻击失效。盐为每个用户唯一生成,并与哈希值一起保存。

盐的工作原理与数值示例

在对密码进行哈希处理时,用密码学安全的随机数生成器生成盐,将其与密码结合后再输入哈希函数。例如,给密码「mypassword」附加 16 字节 (128 位) 的盐,即使是相同的密码也会为每个用户生成完全不同的哈希值。盐的推荐长度为 16 字节以上,bcrypt 中标准为 128 位,Argon2 中标准为 128 位以上。截至 2025 年的 OWASP 指南推荐 Argon2id 与 16 字节以上的盐相结合。盐无需保密,可与哈希值一起保存在数据库中。重要的是为每个用户使用不同的盐。密码哈希化的书籍 (Amazon)中有详细解说。

现场使用案例

“在安全审计中,我们发现遗留系统的密码保存未使用盐。目前正将迁移到 Argon2id + 16 字节盐作为最高优先级任务处理。”

为什么需要盐

如果没有盐,使用相同密码的用户全都会得到相同的哈希值。攻击者可以使用彩虹表一次性破解大量密码。用具体数值来看,在没有盐的情况下,攻击者只需一张彩虹表 (数百 GB 左右) 即可攻击全部用户的密码。但若使用 16 字节的盐,理论上需要 2 的 128 次方种表,预计算攻击在实际上将变得不可能。

实务中的陷阱

常见的错误是对所有用户使用相同的盐,这会大幅降低使彩虹表失效的效果。同样,如果盐的长度过短 (例如 4 字节以下),攻击者也能制作出涵盖所有盐模式的表。另一个陷阱是试图将盐作为「秘密」保存在其他地方。盐的目的是确保唯一性而非保密,因此与哈希值保存在同一数据库中没有问题。随机生成的密码本身就难以猜测,但与服务端的盐实现相结合,可以实现更为坚固的保护。认证技术入门书 (Amazon)也可作为参考。

相关术语

这篇文章对您有帮助吗?

XHatena