SHA512和MD5哈希

3

最近我一直在寻找一种更安全的方式来哈希用户密码并将其插入到数据库中。我已经研究了所有可用的哈希方法。有人说bcrypt是最好的,因为它很慢。如果我不需要最高级别的安全性,但仍然要保持安全,我可以使用sha512,然后对该哈希使用md5算法。如果我颠倒哈希的顺序会有区别吗?请注意,我将为每个操作使用单独的salt。这样是否安全?还有其他可以达到相同目的的组合吗?

2个回答

5
任何您发明的自定义方法都更有可能存在微妙的错误,使您的存储方法容易受到攻击。这并不值得,因为在发现这些微妙的错误之前,很可能已经为时过晚了。最好使用已经经过尝试和测试的东西。
一般来说,在存储密码时,您有以下选择:
- 使用 bcrypt。 - 使用加盐强化哈希。
第一种方法很简单,只需使用bcrypt即可。它支持几乎所有语言,并已被广泛使用和测试以确保其安全性。
第二种方法需要您使用通用哈希函数(SHA-2系列或更好,不要使用已经破解/弱化的MD5或SHA-1),或者更好的是使用HMAC,为用户创建一个唯一的盐和一个唯一的应用程序级别的盐,然后迭代哈希函数多次(100,000次等)以减慢它的速度(称为密钥延展/加固)。
例如(伪代码)
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

好的,我会使用bcrypt。谢谢你的帮助! - Sneitzke38

2
我不认为使用MD5有任何意义。它已经被破解了。但是多重循环显然更强大。然而,两轮的改进不太可能产生太大的差异。反复应用SHA512会更好。
如果您还没有这样做,您应该关注用户密码长度并对密码进行加盐。 “双重哈希”密码是否比仅哈希一次的密码更安全?提供了有关算法多轮运算的详细评论。
实际上,我怀疑被破解的SHA-512密码数量很少,更重要的是要防止他们在第一时间看到密码,确保系统免受SQL注入、特权升级等威胁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接