【问题标题】:Security of bcrypt iterations/cost parameterbcrypt 迭代/成本参数的安全性
【发布时间】: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


【解决方案1】:

BCrypt 不会进行愚蠢的迭代,它在每次迭代中都包含原始密码和盐。 PBKDF2 也是如此,它在每次迭代中都使用 HMAC。看看 BCrypt 的pseudo code

Information Security 上有一个非常 illustrative answer 关于迭代哈希冲突的影响。在实践中,据我所知,即使在迭代时,冲突也不是密码哈希的真正问题。

【讨论】:

  • “愚蠢”这个词是否适用于这里的特定事物?它是密码学中的一个艺术术语吗?
  • @Glyph - 不,我所说的愚蠢的迭代是当有人尝试实现键拉伸时你经常可以看到的:一个简单的for 散列循环,使用输出作为输入下一次迭代。实际上,这甚至会起作用,因为攻击者必须这样做,并且在暴力破解时会花费更多。密码散列算法不是这样工作的,它们以更复杂的模式将原始盐与迭代的输入结合起来,以生成迭代的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2016-05-28
  • 1970-01-01
  • 2017-04-15
  • 2023-03-14
  • 1970-01-01
  • 2011-10-11
相关资源
最近更新 更多