【发布时间】:2015-08-11 02:38:41
【问题描述】:
事实 A. 根据鸽洞原理,每个哈希函数都有无限次的冲突,即使还没有找到。
事实 B. 重新散列哈希,例如 hash(hash(password)) 并不比 hash(password) 更安全,实际上 hash(hash(password)) 会引发使用 hash(密码)。
事实 C。基于 B,通过增加迭代,我们达到了一个点,即大多数密码和盐将返回相同的恒定哈希值。我的意思是碰撞的概率会很高,甚至是 100%。
事实 D. bcrypt 有一个迭代/成本参数,我们可以根据我们的硬件规格随时间增加。
那么,结合这些事实,我们是否可以说在 bcrypt 成本值较高的情况下,我们会通过增加碰撞概率来降低安全性? 如果答案是“否”,为什么?
【问题讨论】:
-
事实 B 是 dubious。
-
@zneak,让我们看看这个例子:hash(s1)=X 和 hash(s2)=Y。但是如果 hash(X) = hash(Y) 发生碰撞 那么 hash(hash(hash(s1))) 和 hash(hash(hash(s2))) 和在此之后的所有其他哈希都将相等。在无限迭代中 - 基于事实 A - 所有密码的所有哈希值都将相等。所以,永远不要使用 hash(hash(password)),因为它根本不安全。
-
您担心的是,一旦发生冲突,散列迭代就会变得有害。这如何平衡对单次迭代哈希的暴力破解是微不足道的担忧?天真地,哈希密码两次将哈希吞吐量除以二。我对在相同条件下碰撞几率比翻倍更糟糕的说法持怀疑态度。
-
英语不是我的母语,我听不懂你想说什么。但是,如果我理解正确,我想说最好在每次迭代中使用密码和盐,因为 martinstoeckli 说 Bcrypt 和 PBKDF2 也在使用这种方法。 (看看接受的答案)。因此,如果 hash(pass1+salt1+hash(pass1+salt1)) 和 hash(pass2+salt2+hash(pass2+salt2)) 产生相同的值,则 hash(pass1+salt1+hash(pass1+salt1+hash(pass1+salt1) ))) 将不等于 hash(pass2+salt2+hash(pass2+salt2+hash(pass2+salt2)))。
-
我在another answer 中更深入地写了这篇文章,但您忽略的另一个因素是,为了使碰撞产生影响,它必须发生在 相同的迭代中我>。由于散列函数的确定性,这意味着 n 次迭代后发生冲突的可能性并不比 1、2、... n-1 次迭代后的可能性更大。如果 hash(s1) == hash(s2),那么 hash(hash(s1)) == hash(hash(s2)),但这完全取决于第一次发生的冲突,这是极不可能的(对于良好的哈希算法输入小于输出宽度)。
标签: security hash passwords password-protection bcrypt