在存储之前对密码进行两次哈希处理的安全性是否比仅仅哈希一次更安全?
我在说什么是这样做的:
$hashed_password = hash(hash($plaintext_password));
Run Code Online (Sandbox Code Playgroud)
而不仅仅是这个:
$hashed_password = hash($plaintext_password);
Run Code Online (Sandbox Code Playgroud)
如果它不太安全,你能提供一个很好的解释(或链接到一个)吗?
此外,使用的哈希函数是否有所作为?如果混合使用md5和sha1(例如)而不是重复相同的散列函数,它会有什么不同吗?
注1:当我说"双重哈希"时,我正在谈论两次哈希密码以试图使其更加模糊.我不是在谈论解决碰撞的技术.
注2:我知道我需要添加一个随机盐来真正使其安全.问题是使用相同算法进行两次散列是否有助于或损害散列.
我一直在写2个cookie,1个包含用户ID,第2个包含密码的SH1哈希的1/2(盐渍).它的工作方式是不言而喻的.
我意识到我并没有以最安全的方式做到这一点.这是一个更好的方法吗?最好使用单个身份验证cookie.
还有,使用"难以计算哈希"是否有意义?我的意思是,使用bcrypt,或者用漩涡对每个项目进行散列10,000次,使其成为(相对)慢的散列函数(200 ms vs小于1 ms只是简单的SHA1)?我的意思是,如果有人违反了你的数据库并获得了哈希......那么还有什么需要保护,因为你的所有数据都在同一个数据库中(除非你有某种分散设置,我不这样做).
我想知道散列散列的过程是否有助于在与盐一起使用时阻止对它的攻击(我认为是暴力).所以我的代码:
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等算法的行为?