建议的哈希算法用于存储密码是什么?

时间:2010-03-31 02:06:15

标签: encryption passwords hash

鉴于MD5的已知弱点以及SHA1中讨论的最近(2009年5月)的弱点,新节目应该如何腌制?哈希他们的密码?

我见过SHA-256和SHA-512建议。

主要在Ruby on Rails中编程并使用PostgreSQL - 但其他语言和环境也可能需要计算密码哈希值。

4 个答案:

答案 0 :(得分:21)

SHA-256和SHA-512在可预见的未来是安全的。他们属于SHA-2家族,到目前为止尚未发现任何攻击。 This wikipedia page说Unix和Linux供应商刚刚转向SHA-2进行密码安全散列。 SHA-3系列具有更强大的算法,正在开发中,但至少要到2012年才能完成。

P.S:除非你从政府那里隐藏秘密特工名称,否则你对SHA-1也是安全的,但如果实施SHA-2没问题,那就改用它吧。

答案 1 :(得分:17)

使用像bcrypt这样的慢速功能。 Here是来自Phusion家伙的帖子。

答案 2 :(得分:7)

您应该使用基于密码的密钥派生函数作为uid / pwd结果;最常见的是PBKDF2 http://en.wikipedia.org/wiki/PBKDF2,也定义为RFC 2898 http://tools.ietf.org/html/rfc2898。 PKBDF2获取您的秘密数据以及盐和迭代计数。这是解决问题的标准方式。

如果您使用.NET编程,请使用Rfc2898DeriveBytes http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

答案 3 :(得分:-4)

您应该使用哈希用户名,密码和salt,例如:

hash(length(username)+"_veryuniquesalt4rtLMAO"+username+password)

这样,您的数据库不容易受到任何现有彩虹表的影响,因为盐,并且用户名和密码一起散列,也无法为您的特定散列方法创建彩虹表。

使用“慢”散列算法可以更好地保护密码,就像它们更复杂一样,但这是一个权衡,一旦你决定了一定程度的缓慢,你不能只在你需要时缩减其他事情的表现。

也可以使用JavaScript进行慢速哈希客户端,这样就不会出现性能问题,但该方法当然需要启用JavaScript。

无论你选择什么,稍微慢一点都比没有好,使用1毫秒而不是1微秒,你的保护强度是1000倍。

您可以使用bcrypt,或者您可以使传统的哈希算法做很多额外的工作,只需确保额外的工作主要不是字符串连接。

最后,最好不要让你的数据库被盗,很多密码都很弱,无论你做什么都很容易提取。