我一直在使用PHPass来密码我的密码很长一段时间。我承认还有一些我不能完全理解(或忽略)正确散列密码的东西所以今天我正在审查我能找到的所有相关信息。
回顾PHPass文档,我已经踏入了这个:
除了实际散列之外,当新密码或密码被散列时,phpass透明地生成随机盐,并且它将散列类型,salt和密码拉伸迭代计数编码到它返回的“散列编码字符串”中。当phpass对存储的哈希验证密码或密码时,它同样透明地提取并使用哈希类型标识符,盐和“哈希编码字符串”中的迭代计数。 因此,您不必费心自己进行腌制和拉伸 - phpass会为您解决这些问题。
我加粗了困扰我的句子
我总是认为盐应该有些秘密,因为攻击者不应该知道它。因此,如果正确理解,PHPass会将相同哈希中使用的盐存储起来,以便在比较密码时能够使用它并检查是否有效。
我的问题是
答案 0 :(得分:3)
一点背景
盐并不意味着是秘密的,相反,盐通过确保每个使用的实例的哈希结果是唯一的“工作”。这是通过为每个计算的散列选择不同的随机盐值来完成的。
盐的意图在知道时不会受到损害;攻击者仍然需要分别攻击每个哈希。因此,您只需将盐与密码一起存储即可。
那么,PHPass安全吗?
是! PHPass(根据最佳实践)为您生成强大的随机盐。这是一个经过良好审查和高质量的图书馆。
感兴趣的链接:
How to securely hash passwords?
How to store salt?
Password Hashing add salt + pepper or is salt enough?
Salt Generation and open source software
答案 1 :(得分:1)
如果我理解正确,盐主要用于阻止预先计算的哈希/彩虹表攻击。只要生成使用的哈希值,使其合理地全局唯一(例如,不在PHPass中进行硬编码),就可以了。
答案 2 :(得分:1)
盐的目的不是秘密。目的是为每个散列输入添加一个唯一的组件,因此相同的密码不会散列到相同的散列,从而使得暴力过程更加困难和耗时,因为必须单独尝试每个散列。
是的,如果盐是秘密的话会稍微安全一些,但在实践中很难实现,因为你的应用程序也需要盐,所以它需要存储在某个地方密码也可以访问。因此,在实践中,当攻击者获得密码哈希时,他通常也能够获得盐。