6

很长一段时间以来,我一直在使用 PHPass 对我的密码进行哈希处理。我承认仍有一些我不完全理解(或忽略)正确散列密码的事情,所以今天我正在审查我能找到的所有信息。

回顾 PHPass 文档,我已经进入了这个:

除了实际的散列,phpass 在新密码或密码被散列时透明地生成随机盐,并将散列类型、盐和密码拉伸迭代计数编码到它返回的“散列编码字符串”中。当 phpass 针对存储的散列验证密码或密码短语时,它同样透明地提取并使用散列类型标识符、盐和“散列编码字符串”中的迭代计数。因此,您无需自己费心腌制和拉伸- phpass 会为您处理这些。

我把困扰我的句子加粗了。
我一直认为盐应该是秘密的,因为攻击者不应该知道它。因此,如果理解正确,PHPass 会将使用的盐存储在相同的哈希中,以便在比较密码并检查是否有效时能够使用它。
我的问题是

  1. 这安全吗?如果散列被泄露,攻击者拥有用于散列密码的盐......这里有一些我想念的东西。
  2. 我在这里真的可以免费为密码加盐吗?我真的可以依赖 PHPass 吗?
4

3 回答 3

3

一点背景
盐并不意味着是秘密的,相反,盐通过确保每个使用的实例的哈希结果唯一来“起作用”。这是通过为每个计算的哈希选择不同的随机盐值来完成的。

当人们知道盐的意图时,它不会受到损害;攻击者仍然需要分别攻击每个哈希。因此,您可以简单地将盐与密码一起存储。

那么,PHPass 安全吗?
是的!PHPass(根据最佳实践)为您生成强随机盐。这是一个经过良好审查且质量上乘的图书馆。

感兴趣的链接
如何安全地散列密码?
如何储存盐?
密码散列加盐+胡椒还是盐就够了?
Salt Generation 和开源软件

于 2012-08-27T10:30:08.543 回答
1

盐的目的不是秘密。目的是为每个散列输入添加一个唯一组件,因此相同的密码不会散列到相同的散列,从而使暴力破解过程更加困难和耗时,因为必须单独尝试每个散列。

是的,如果盐是秘密的,它会稍微安全一些,但这在实践中很难实现,因为你的应用程序也需要盐,所以它也需要存储在可以访问密码的地方。因此,在实践中,当攻击者获得密码哈希时,他通常也能够获得盐。

于 2012-08-27T10:28:58.857 回答
1

如果我理解正确,盐主要用于阻止预先计算的哈希/彩虹表攻击。只要生成使用的散列,使其在全球范围内具有合理的唯一性(例如,在 PHPass 中没有硬编码),就可以了。

于 2012-08-27T10:27:22.507 回答