Security bcrypt迭代/成本参数的安全性

Security bcrypt迭代/成本参数的安全性,security,hash,passwords,password-protection,bcrypt,Security,Hash,Passwords,Password Protection,Bcrypt,事实A.根据鸽子洞原理,每个哈希函数都有无穷多的冲突,即使还没有找到冲突 事实B.重新散列一个散列,比如散列(密码)并不比散列(密码)更安全,实际上散列(密码)会引发一个使用散列(密码)不可能的冲突攻击 事实C.基于B,通过增加迭代次数,我们达到了一个点,即大多数密码和salt将返回相同的常量散列值。我的意思是碰撞的概率很高,甚至100% 事实D.bcrypt有一个迭代/成本参数,我们可以根据硬件规格随时间增加 那么,结合这些事实,我们能说随着bcrypt成本值的增加,我们会通过增加碰撞概率来降

事实A.根据鸽子洞原理,每个哈希函数都有无穷多的冲突,即使还没有找到冲突

事实B.重新散列一个散列,比如散列(密码)并不比散列(密码)更安全,实际上散列(密码)会引发一个使用散列(密码)不可能的冲突攻击

事实C.基于B,通过增加迭代次数,我们达到了一个点,即大多数密码和salt将返回相同的常量散列值。我的意思是碰撞的概率很高,甚至100%

事实D.bcrypt有一个迭代/成本参数,我们可以根据硬件规格随时间增加

那么,结合这些事实,我们能说随着bcrypt成本值的增加,我们会通过增加碰撞概率来降低安全性吗?
如果答案是“否”,为什么?

BCrypt不会进行愚蠢的迭代,它在每次迭代中都包含原始密码和salt。PBKDF2也是如此,它在每次迭代中都使用HMAC。请看一下BCrypt的名称


关于迭代哈希冲突的影响,在信息安全方面有着非常重要的意义。在实践中,据我所知,即使在迭代时,冲突也不是密码哈希的真正问题。

事实B是。@zneak,让我们看看这个例子:散列(s1)=X和散列(s2)=Y。但是如果散列(X)=散列(Y)发生冲突,那么散列(散列(s1))、散列(散列(s2)),以及之后的所有其他散列都将相等。在无限次迭代中——基于事实A——所有密码的所有哈希值都是相等的。所以,永远不要使用哈希(hash(password)),因为它根本就不安全。您担心的是,一旦发生冲突,哈希迭代就会变得有害。如何平衡暴力对抗单一迭代散列是微不足道的这一担忧?简单地说,哈希密码两次将哈希吞吐量除以2。我怀疑在相同条件下碰撞的几率比翻倍更糟糕的说法。英语不是我的母语,我不明白你想说什么。但是,如果我没有弄错的话,我想说的是,最好在每次迭代中使用密码和salt,因为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))。我在中更深入地写了这一点,但您忽略的另一个因素是冲突会产生影响,它必须发生在同一个迭代中。由于散列函数的确定性,这意味着n次迭代后的冲突不比1、2、。。。n-1次迭代。如果hash(s1)=hash(s2),那么hash(hash(s1))==hash(hash(s2)),但这完全取决于发生的第一次冲突,这是不可能的(对于输入小于输出宽度的好的hash算法来说)。单词“愚蠢”是否适用于这里的特定内容?这是密码学中的一个艺术术语吗?@Glyph-不,我对愚蠢迭代的意思是,当有人试图实现密钥拉伸时,你经常会看到:一个简单的
散列循环,使用输出作为下一次迭代的输入。事实上,这甚至会起作用,因为攻击者也必须这样做,并且在暴力强迫时花费更多。密码散列算法不是这样工作的,它们以更复杂的模式将原始salt与迭代的输入相结合,以生成迭代的输出。