Encryption 什么';存储密码的建议哈希算法是什么?

Encryption 什么';存储密码的建议哈希算法是什么?,encryption,passwords,hash,Encryption,Passwords,Hash,鉴于MD5的已知弱点以及SHA1中讨论的最近(2009年5月)的弱点,新程序应该如何对其密码进行加密和散列 我看过SHA-256和SHA-512 主要使用Ruby on Rails和PostgreSQL编程,但其他语言和环境也可能需要计算密码散列。SHA-256和SHA-512在可预见的未来是安全的。他们属于SHA-2家族,目前还没有发现针对他们的袭击。说Unix和Linux供应商现在正转向SHA-2,以实现密码的安全散列。拥有更强大算法的SHA-3系列正在开发中,但至少要到2012年才能准备就

鉴于MD5的已知弱点以及SHA1中讨论的最近(2009年5月)的弱点,新程序应该如何对其密码进行加密和散列

我看过SHA-256和SHA-512


主要使用Ruby on Rails和PostgreSQL编程,但其他语言和环境也可能需要计算密码散列。

SHA-256和SHA-512在可预见的未来是安全的。他们属于SHA-2家族,目前还没有发现针对他们的袭击。说Unix和Linux供应商现在正转向SHA-2,以实现密码的安全散列。拥有更强大算法的SHA-3系列正在开发中,但至少要到2012年才能准备就绪


注:除非你对政府隐瞒特工的姓名,否则SHA-1也会安全,但如果实现SHA-2没有问题,就用那个吧。

使用像bcrypt这样的慢功能。是来自Phusion guys的帖子。

您应该同时使用散列用户名、密码和salt,如:

hash(length(username)+"_veryuniquesalt4rtLMAO"+username+password)
这样,您的数据库就不会因为salt而受到任何现有rainbow表的攻击,并且随着用户名和密码的散列,也不可能为您的特定散列方法创建rainbow表

使用“慢”散列算法可以更好地保护密码,就像密码更复杂一样,但这是一种折衷,一旦你决定了某种程度的慢度,你就不能在需要其他性能时缩减

也可以使用JavaScript对客户端进行缓慢的哈希处理,这样就不会造成性能问题,但该方法当然需要启用JavaScript

不管你选择什么,稍微晃动一下总比什么都不晃动好得多,用1毫秒代替1微秒,你的保护能力会增强1000倍

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


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

你应该使用基于密码的密钥派生函数作为uid/pwd结果;最广为人知的是PBKDF2,也被定义为RFC2898。PKBDF2获取您的机密数据、salt和迭代计数。这是解决问题的标准方法


如果在.NET中编程,请使用Rfc2898DeriveBytes

注意,将用户名包含在哈希中可防止更改用户名。根据系统要求,这可能是可取的,也可能不是可取的。在不需要的情况下,使用uid(或guid,或等效值)将是一种替代方法。您只需让用户输入密码即可更改用户名,这是最佳做法。代码中有一个非常微妙的错误-您永远不应该在哈希中包含数据。H(x+y+z)会使你受到一次长度扩展攻击。相反,您应该:H(H(x+y+z))或H(H(x)+H(y)+H(z))这不是一个很好的建议(salt不应该是一个常量字符串-每个密码应该有一个salt,每次更改密码时都应该随机生成),而且它无论如何都不会回答问题,特别是询问使用哪个散列函数。关于算法需要说的话已经说过了,我没有必要重复别人说过的话。用户名+特定于站点的字符串构成了一种完全独特的salt,再好不过了。你的方法达到了同样的效果,但没什么。PKCSα5()讨论了读者可能要考虑的其他好信息(如迭代)。@中午丝绸:目前需要多少计算能力来破解它?@中午丝绸:根据该页面,目前的断言只是理论。(也就是说,我发现了比暴力/生日快一点的东西。也就是说,我原来的帖子是一年前写的,我完全希望P.S.在不久的将来会变得非常错误。)future@Eli当前位置请注意,这次攻击也是6年前发生的,因此不清楚从那以后有什么进展。我的意思是,你的主要帖子很好,我没有投反对票ou,但我不同意你的最后一句话。可能不需要继续讨论它;我的评论和信息已经提供。谢谢Martin,我确实理解。这是一个狭隘的问题,应该得到一个狭隘的答案。我刚刚阅读了100篇关于这个主题的文章和问题,似乎同意RFC2898或任何其他多迭代解决方案on(例如BCrypt)是一个不错的选择。但是Rfc2898DeriveBytes是基于SHA-1的,不是吗?它不会过时吗?而且BCrypt看起来没有“验证”,尽管它看起来很棒。而且,Rfc2898DeriveBytes没有实现IDisposable,它看起来很容易泄露内存中的明文密码。我的实际需求并没有那么偏执,但我想衡量每件事情有多安全。你对此有何看法?谢谢!