一段时间以来,我一直在寻找一种更安全的方法来在我的网站上散列用户密码,以便将其插入到数据库中。我研究了所有可用的散列方法。据说bcrypt是最好的,因为它的速度很慢。我在想,如果我不需要最高的安全性,但仍然保持安全。如果我使用sha512,然后在该散列上使用md5,该怎么办?如果我颠倒了哈希的顺序,会有关系吗?请记住,我将为每项操作使用单独的盐。这会有多安全?有没有其他组合可以做同样的事情?SHA512和MD5哈希
回答
您发明的任何自定义方法都更容易产生微妙的错误,这些错误会使您的存储方法受到攻击。这是不值得的努力,因为你不可能找到这些微妙的错误,直到为时已晚。使用经过尝试和测试的东西要好得多。
一般来说,这些都是你的选择保存密码时,
- 使用bcrypt。
- 使用腌制,加强的散列。
第一种方法很简单,就是使用bcrypt。它几乎支持任何语言,并且已被广泛使用和测试以确保其安全性。
第二种方法要求您使用通用散列函数(SHA-2系列或更高版本,而不是MD5或SHA-1,如they're broken/weak)或更好,HMAC为用户创建独特的盐,然后迭代散列函数多次(100,000等)以使其减慢(称为key stretching/strengthening)。
例如(伪)
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。
我根本没有看到使用MD5的意义。它坏了。但多轮显然更强。然而,两轮的改善不会有太大的区别。多次应用SHA512会更好。
而应该寻找在用户密码长度和腌制的密码,如果你没有这样做
Is "double hashing" a password less secure than just hashing it once?提供了多轮的算法的详细解说。
实际上,我怀疑破解的SHA-512密码的数量很少,还有更重要的事情需要担心,比如阻止他们首先看到密码 - 确保您的系统免受SQL注入的攻击,特权升级等。
哈哈,你打我吧。这篇文章是一个很好的文章。 – Dessus
这听起来像个好主意。谢谢! – Sneitzke38
- 1. SQL 2005 MD5哈希和C#MD5哈希
- 2. C#MD5哈希Groovy的MD5哈希
- 3. PHP MD5(MD5)哈希
- 4. Symfony2(FOSUserBundle)SHA512哈希不匹配C#SHA512哈希
- 5. PHP MD5哈希
- 6. MD5和SHA1 C++哈希库
- 7. MD5哈希和Base64编码
- 8. 的Python 3哈希HMAC-SHA512
- 9. Vb.net解密SHA512哈希
- 10. 解密MD5哈希
- 11. MD5哈希更快
- 12. 生成MD5哈希
- 13. GPU MD5/SHA1哈希
- 14. Java MD5哈希不匹配.NET哈希
- 15. Python和其他文件哈希之间的MD5哈希差异
- 16. JavaScript MD5哈希与Java Applet MD5散列?
- 17. MD5哈希和Python中的比较
- 18. Md5哈希标识和存档图像
- 19. .net和java的不同MD5哈希值
- 20. MD5哈希和正则表达式
- 21. SharePoint文件MD5哈希
- 22. MD5哈希在药剂
- 23. MD5哈希中的WindowsPhone 8
- 24. VB.net + mySQL + md5哈希建议
- 25. 制作md5散列哈希
- 26. MD5哈希生成问题
- 27. Windows 8的VB MD5哈希
- 28. MD5哈希特殊字符
- 29. MD5哈希发布图像
- 30. BSD unix md5哈希位值
好的,我会用bcrypt。谢谢您的帮助! – Sneitzke38