Coda Hale 的文章“如何安全地存储密码”声称:
bcrypt 内置了盐以防止彩虹表攻击。
他引用了这篇论文,其中说在 OpenBSD 的实现中bcrypt
:
OpenBSD 从一个 arcfour (arc4random(3)) 密钥流生成 128 位 bcrypt salt,并使用内核从设备时序收集的随机数据播种。
我不明白这是怎么回事。在我对盐的概念中:
- 每个存储的密码都需要不同,因此必须为每个密码生成单独的彩虹表
- 它需要存储在某个地方以便可重复:当用户尝试登录时,我们会尝试输入他们的密码,重复我们最初存储密码时所做的相同的盐和哈希过程,然后比较
当我使用带有 bcrypt 的 Devise(Rails 登录管理器)时,数据库中没有 salt 列,所以我很困惑。如果盐是随机的并且没有存储在任何地方,我们如何可靠地重复散列过程?
简而言之,bcrypt 怎么能有内置的 salts呢?