我一直在考虑升级我的一个应用程序的密码哈希安全性,因为我一直在阅读关于蛮力攻击比以前快得多的信息。目前我正在使用sha1(md5($password))
,我看到了使用 bcrypt + salt 的好处。我的问题是,如果我执行以下操作会更安全:
场景一:
$password -> sha1 -> bcrypt -> sha1
// This would enable me to keep all existing passwords and just
// regenerate all the hashes without waiting for the user to re login
场景二:
$password -> bcrypt -> sha1
// I would have to add an extra column for the new hash until every
// user has logged in but the hash will still be sha1.
这两者中的任何一个都会增加哈希的安全性吗?我不是密码学大师,远非如此,我只想简单解释一下它是否可行,如果不可行,以及为什么。
谢谢
编辑
在阅读了更多内容之后,似乎 bcrypt 受到青睐,因为它的速度很慢,因为 i 使 cpu/gpu 在生成哈希之前工作的时间更长。
在 sha1 与 bcrypt 的情况下,sha1 大约比 bcrypt 快 300000 倍。这就引出了一个问题,如果 bcrypts 的优势是速度慢,那么使用 sha1 300000 次的递归散列函数肯定会和 bcrypt 一样安全吗?
我以这个函数为例:
function bsha1($data, $salt) {
$hash = $data;
for ($i = 0; $i < 300000; ++$i) {
$hash = sha1($hash . $salt);
}
为它提供一个盐,它会返回一个 sha1 散列,其中每次迭代都是一个散列散列和盐。这需要与 bcrypt 大致相同的时间。这会一样安全吗?