有一段时间以来,我一直在寻找一种更安全的方法来在我的网站上散列用户密码,以便插入到数据库中。我已经研究了所有可用的散列方法。有人说bcrypt是最好的,因为它的速度很慢。我在想,如果我不需要最高的安全性,但仍然保持安全。如果我在该哈希上使用sha512然后使用md5会怎么样?如果我改变了哈希的顺序,这有关系吗?请记住,我将为每个操作使用单独的盐。这有多安全?还有其他组合可以做同样的事情吗?
答案 0 :(得分:5)
您发明的任何自定义方法都可能会产生微妙的错误,使您的存储方法容易受到攻击。这是不值得的,因为你不太可能找到这些微妙的错误,直到为时已晚。使用经过试验和测试的东西要好得多。
通常,这些是您在存储密码时的选择
第一种方法很简单,只需使用bcrypt即可。它几乎支持任何语言,并且已被广泛使用和测试以确保其安全性。
第二种方法要求您使用通用散列函数(SHA-2族或更好,而不是MD5或SHA-1作为they're broken/weak)或更好,HMAC,创建一个唯一的用户的salt和一个独特的应用程序范围的salt,然后多次迭代哈希函数(100,000等)以减慢它(称为key stretching/strengthening)。
e.g。 (伪代码)
sofar = hash("sha512", user_salt + site_salt + input_password);
iterations = 100000; // Should be changed based on hardware speed
while (iterations > 0)
{
sofar = hash("sha512", user_salt + site_salt + sofar);
iterations--;
}
user.save("password", "$sha512$" + user_salt + "$" + iterations + "$" + sofar);
每次迭代都应该依赖于前一次迭代,因此有人无法并行化强力方法来打破它。同样,应根据硬件的速度更改迭代次数,以便进程足够慢。密码散列问题越慢越好。
<强>摘要强>
使用bcrypt。
答案 1 :(得分:2)
我根本没有看到使用MD5的重点。它坏了。但多轮似乎更强。然而,两轮的改善不太可能产生太大的影响。多次使用SHA512会更好。
如果你还没有这样做,你应该查看用户密码长度和密码密码
Is "double hashing" a password less secure than just hashing it once?提供了关于多轮算法的详细评论。
实际上我怀疑破解的SHA-512'd密码的数量很少,而且还有一些比较重要的事情要担心,比如防止他们首先看到密码 - 确保您的系统不受SQL注入,特权升级等等。