Hash 为什么我需要将原始salt添加到密码的每个哈希迭代中?

Hash 为什么我需要将原始salt添加到密码的每个哈希迭代中?,hash,passwords,salt,Hash,Passwords,Salt,我理解在多次迭代中散列密码对攻击者来说很重要。我已经读过很多次,在处理这些迭代时,不仅要散列前面散列的结果,而且每次都要附加原始salt。换言之: 我需要而不是这样做: var hash = sha512(salt + password); for (i = 0; i < 1000; i++) { hash = sha512(hash); } var hash=sha512(salt+密码); 对于(i=0;i

我理解在多次迭代中散列密码对攻击者来说很重要。我已经读过很多次,在处理这些迭代时,不仅要散列前面散列的结果,而且每次都要附加原始salt。换言之:

我需要而不是这样做:

var hash = sha512(salt + password); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); 
}
var hash=sha512(salt+密码);
对于(i=0;i<1000;i++){
hash=sha512(hash);
}
相反,我们需要这样做:

var hash = sha512(salt + password); 
for (i = 0; i < 1000; i++) {
    hash = sha512(salt + hash); 
}
var hash=sha512(salt+密码);
对于(i=0;i<1000;i++){
hash=sha512(salt+hash);
}

我的问题是关于这里的数学。为什么我上面的坏例子让攻击者更容易对付?我听说它会增加碰撞的可能性,但我不明白为什么。

这并不是说你只需要做“hash=sha512(salt+hash)”——它比这更复杂。HMAC是添加盐的更好方法(PBKDF2是基于HMAC的-请参阅下面关于PBKDF2的更多详细信息)-关于这些详细信息,现在有一个很好的讨论

您是正确的,因为您需要对哈希函数进行多次迭代以实现安全性

但是,不要自己滚。请参阅,并注意PBKDF2、BCrypt和Scrypt都是这样做的方法

PBKDF2,也称为PKCS#5v2,实际上相当接近您正在做的事情(正常哈希函数的多次迭代),特别是以PBKDF2-HMAC-SHA-512的形式,特别是第5.2节列出:

     For each block of the derived key apply the function F defined
     below to the password P, the salt S, the iteration count c, and
     the block index to compute the block:

               T_1 = F (P, S, c, 1) ,
               T_2 = F (P, S, c, 2) ,
               ...
               T_l = F (P, S, c, l) ,

     where the function F is defined as the exclusive-or sum of the
     first c iterates of the underlying pseudorandom function PRF
     applied to the password P and the concatenation of the salt S
     and the block index i:

             F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c

     where

               U_1 = PRF (P, S || INT (i)) ,
               U_2 = PRF (P, U_1) ,
               ...
               U_c = PRF (P, U_{c-1}) .

     Here, INT (i) is a four-octet encoding of the integer i, most
     significant octet first.

p.S.SHA-512是散列原语的一个很好的选择-SHA-512(和SHA-384)也优于MD5、SHA-1,甚至SHA-224和SHA-256,因为SHA-384及以上使用64位操作,而当前GPU(2014年初)与当前CPU相比没有32位操作的优势,从而降低了攻击者对离线攻击的优势。

谁说这样更好?我并不是说它不是,但可能上下文中包含一些论点?你能提供一个参考,说明你应该更喜欢第二个而不是第一个吗?我个人认为这并不重要(尽管我可能会使用第二个,因为为什么不)但可能会在crypto.stackexchange中发布。这个问题是边缘问题,因为它更多的是关于加密算法的安全性,而不是关于其实现。在任何情况下,它都是开着的。当然你写的是真的,但是问题是关于在每次迭代中添加盐的非常具体的。这个问题被转载了,看看答案吧。