PHP:迭代散列是否使其更安全?


PHP: Does iterating a hash make it more secure?

我想知道哈希散列的过程是否有助于阻止对它的攻击(我认为是暴力攻击),当与盐一起使用时。所以我的代码是:

function hash_password($password, $salt, $site_key) {
    $hash = hash('sha512', $password . $salt . $site_key);
    for ($i=0; $i<1000; $i++) {
        $hash = hash($hash);
    }
    return $hash;
}

从我可以得出的结论,我的代码是安全的,因为它通过使用盐来阻止彩虹表攻击,并通过迭代哈希来阻止暴力攻击。

这个迭代实际上会使暴力攻击更加困难吗?如果是这样,它对性能的影响有多大?(哈希1000次需要多长时间,我听说你应该迭代哈希直到需要200ms)

这样做是否模拟了bcrypt等算法的行为?

是的,原因很简单。构建哈希是为了速度,而不是安全性(因为它通常用于计算大文件的校验和)。因此,一台拥有强大CPU的计算机(或者一个使用GPU的黑客)可以以每秒10亿哈希的速度暴力破解你的代码。

如果你确保你的哈希算法更慢(通过迭代一千次),同样的计算机每秒只能执行这个算法一百万次,而不是一百次。所以如果攻击者用暴力破解密码花了60小时,那么现在需要6万小时,也就是近7年:)


但是,您的代码没有正确地实现它,您一遍又一遍地执行相同的操作,您应该对之前的哈希中得到的哈希进行哈希,并添加一些安全字符(通常是迭代索引)。

while (i < 1000) { hash(somehash) } //wrong
while (i < 1000) { hash = hash(hash . i) } //correct.

PHP已经为您内置了这个功能!将crypt()CRYPT_BLOWFISH(又名bcrypt)结合使用,您可以在函数中输入密码和盐,并在迭代和所有操作之后获得完成的散列。

这里的代码只是一遍又一遍地重复相同的内容。如果您在第一次迭代之后和最后一次迭代之后查看$hash,您将看到它们是相同的。

这就是为什么我们只使用像bcrypt这样的东西。如果你试图自己实现它,你很可能会做错:)