【发布时间】:2014-01-27 00:00:09
【问题描述】:
我了解在多次迭代中散列密码以使攻击者更难操作非常重要。我已经读过很多次了,在处理这些迭代时,不仅要散列前一次散列的结果,而且还要每次都附加原始盐,这一点至关重要。换句话说:
我需要不这样做:
var hash = sha512(salt + password);
for (i = 0; i < 1000; i++) {
hash = sha512(hash);
}
相反,需要这样做:
var hash = sha512(salt + password);
for (i = 0; i < 1000; i++) {
hash = sha512(salt + hash);
}
我的问题是关于这里的数学。为什么我上面的坏例子会让攻击者的事情变得更容易?我听说它会增加碰撞的可能性,但我不明白为什么。
【问题讨论】:
-
谁说它更好?我不是说它不是,但也许上下文包含一些论点?
-
你能提供一个参考,说明你应该更喜欢第二个而不是第一个吗?
-
我个人认为这并不重要(尽管我可能会使用第二个,因为为什么不这样做)但可能会改为在 crypto.stackexchange 中发布。
-
这个问题是边缘问题,因为它更多的是关于加密算法的安全性而不是它的实现。无论如何,它一直是reposted on Cryptography。