我长期使用未加盐的md5 / sha1,但由于这种方法并不真正安全(随着时间的推移越来越不安全),因此我决定切换到加盐的sha512。此外,我想通过使用多次迭代(例如100次)来减慢哈希值的生成速度。
我的问题是,我应该在每次迭代中都添加盐还是仅在开头添加一次。以下是两种可能的代码:
每次都追加:
// some nice big salt
$salt = hash($algorithm, $salt);
// apply $algorithm $runs times for slowdown
while ($runs--) {
$string = hash($algorithm, $string . $salt, $raw);
}
return $string;
仅追加一次:
// add some nice big salt
$string .= hash($algorithm, $salt);
// apply $algorithm $runs times for slowdown
while ($runs--) {
$string = hash($algorithm, $string, $raw);
}
return $string;
我最初想使用第二个版本(只追加一次),但后来发现有些脚本每次都会追加盐。
所以,我想知道每次添加盐是否会增加哈希的强度。例如,攻击者是否可能找到一种聪明的方法来创建一个100timesSha512函数,其速度比仅执行sha512 100次要快得多?
MD5(MD5(data))
将包含所有MD5(data)
的碰撞。这种降级是线性的,所以不是一个重要的问题,但已足以导致PBKDF2
被引入来解决这个问题(考虑到这是PBKDF1
和PBKDF2
之间的主要差异)。 - ircmaxell