我想知道散列哈希的过程是否有助于在与盐一起使用时阻止对它的攻击(我认为是暴力)。所以我的代码:
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;
}
从我可以解决的问题来看,我的代码是安全的,因为它通过使用salt来阻止彩虹表攻击,并通过迭代哈希来阻止暴力攻击。
这次迭代是否会让蛮力攻击变得更加困难? 如果是这样,它会对性能产生多大影响? (哈希需要多长时间才能哈希1000次,我听说有人说你应该迭代哈希,直到花费200毫秒)
这样做是否模仿了bcrypt等算法的行为?
答案 0 :(得分:8)
是的,确实如此,原因很简单。哈希是为了速度而不是安全性而构建的(因为它通常用于计算大文件的校验和)。因此,具有强大CPU(或使用GPU的黑客)的计算机可以强制执行代码,假设每秒10亿次哈希值。
如果你确定你的哈希算法较慢(通过迭代一千次),同一台计算机每秒只能运行100万次算法,而不是一百次。因此,如果攻击者花了60个小时用蛮力破解密码,那么现在需要60,000小时,这将近7年:)
但是,您的代码没有正确实现它,您反复执行相同的操作,您应该散列您在前一个散列中获得的散列,并添加一些安全字符(通常是迭代索引)。
while (i < 1000) { hash(somehash) } //wrong
while (i < 1000) { hash = hash(hash . i) } //correct.
PHP已经内置了这个功能!将crypt()
与CRYPT_BLOWFISH
(a.k.a bcrypt
)结合使用,您可以在函数中输入密码和salt,并在迭代和所有内容之后获得完成的哈希。有关详细信息,请 See this question.
答案 1 :(得分:5)
你所拥有的代码只是一遍又一遍地重复同样的事情。如果您在第一次迭代后和最后一次迭代后查看$hash
,您将看到它们是相同的。
这就是为什么我们只使用像bcrypt这样的东西。如果你试图自己实现它,你很可能做错了:)