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