可能重复:
hash(hash()) vs salted hash
Many hash iterations: append salt every time?
在阅读最近的回答时,我来到了this juicy blog post关于密码哈希的问题,虽然我已经熟悉那里解释的大多数技术,但在我的脑海中出现了一些疑问 - 最相关的是如果我们对哈希值进行拉伸(哈希多次),为什么盐析很重要?
例如,如果我们取字符串“password
”并应用1000次SHA-1散列迭代,我们最终得到“862e52b42b26c0f7e2b6ef5f635226bf0fd3f7fb
”作为我们的最终散列,与“{{1”非常不同“如果我们只把它吹一次。这些迭代是否也算作腌制的意思?在第二次迭代中,我们已经散列了一个40个字符长的字符串,这意味着攻击者必须确定我们使用了多少次迭代(类似地,攻击者也可以猜测我们的秘密盐)或生成一张彩虹表 1 461 501 637 330 902 918 203 684 832 716 283 019 655 932 542 976 组合(5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
)。
有关腌制的其他问题:
我理解使用nonce而非静态(长)盐析的额外好处,但我无法想象任何情况下攻击者可以付出必要的努力来完成成功的蛮力匹配(我认为他们更有可能找到之前的哈希冲突)。此外,如果我们使用nonce进行哈希,我们需要向数据库发出两个查询而不是一个(一个用于获取nonce,因此我们可以计算哈希值,另一个用于检查哈希值)。老实说,我无法理解为什么单独伸展不被认为是“安全的”。
另外,为什么有这么多人采用SHA> 1实现? SHA-1还不安全吗?新闻应用程序是否应使用可用于散列敏感数据的最新SHA实现?当仍然使用MD5 / SHA-1的“旧”应用程序需要将其哈希值迁移到更新的实现时会发生什么?