我想知道哈希散列的过程是否有助于阻止对它的攻击(我认为是暴力攻击),当与盐一起使用时。所以我的代码是:
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这样的东西。如果你试图自己实现它,你很可能会做错:)