鉴于MD5的已知弱点以及SHA1中讨论的最近(2009年5月)的弱点,新节目应该如何腌制?哈希他们的密码?
我见过SHA-256和SHA-512建议。
主要在Ruby on Rails中编程并使用PostgreSQL - 但其他语言和环境也可能需要计算密码哈希值。
答案 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,或者您可以使传统的哈希算法做很多额外的工作,只需确保额外的工作主要不是字符串连接。
最后,最好不要让你的数据库被盗,很多密码都很弱,无论你做什么都很容易提取。