当前位置:  开发笔记 > 后端 > 正文

我应该使用什么算法将密码哈希到我的数据库中?

如何解决《我应该使用什么算法将密码哈希到我的数据库中?》经验,为你挑选了7个好方法。

什么可用的东西不是很容易破碎吗?



1> JeeBee..:

这个2008年的答案现在已经过时了.SHA(所有变体)现在都很容易破解,现在最好的做法是(截至2013年1月)使用密钥扩展哈希(如PBKDF2)或理想情况下RAM密集型哈希(如Bcrypt)并添加每用户盐太.

第2,3和4点仍值得关注.

有关更多信息,请参阅IT Security SE站点.


2008年原创答案:

    使用经过验证的算法.SHA-256在数据库中使用了64个字符,但是列上的索引没有问题,并且它是经过验证的哈希值,比MD5和SHA-1更可靠.它也作为标准安全套件的一部分在大多数语言中实现.但是,如果使用SHA-1,请不要感觉不好.

    不要只是哈希密码,还要在其中加入其他信息.您经常使用"username:password:salt"或类似的哈希,而不仅仅是密码,但如果您使用此密码,那么您将更难以运行字典攻击.

    安全是一个艰难的领域,不要以为你可以发明自己的算法和协议.

    不要写"[AddUser] Hash of GeorgeBush:Rep4Lyfe:ASOIJNTY是xyz"


虽然在发布时可能准确,但现在强烈建议您不要使用SHA-1.
这个答案在当时是准确的,但云处理能力意味着重型暴力攻击现在很便宜.SHA-1和MD5现在很容易破碎.这些天我最少使用SHA-256并且总是添加一个相当大的盐.如果您需要将来进行校对,我会研究一个故意缓慢且处理器密集的哈希,如bcrypt或scrypt.
令人震惊的是,如此短的时间段导致被认为是安全的算法被认为是弱的,仅仅是因为强力攻击的改进.

2> Jim McKeeth..:

密码学和密码存储的第一条规则是" 不要自己发明 ",但如果你必须在这里绝对最低限度,那么你必须做的就是有任何相似的安全性:

基本规则:

    永远不要存储纯文本密码(这意味着您永远不能显示或传输它.)

    切勿在不安全的行(纯文本,编码或散列)上传输存储的密码表示.

    速度是你的敌人.

    随着硬件和密码分析的改进,定期重新分析并改进您的流程.

    密码学和过程是解决方案的一部分.

    故障点包括:存储,客户端,传输,处理,用户,法律保证,入侵和管理员.

脚步:

    实施一些合理的最低密码要求.

    经常更改密码.

    使用你能得到的最强哈希 - 这里建议使用SHA-256.

    将密码与固定盐(整个数据库相同)组合在一起.

    将上一步的结果与存储并附加到此记录的唯一盐(可能是用户名,记录ID,guid,长随机数等)组合在一起.

    多次运行哈希算法 - 比如1000次以上.理想情况下,每次使用前一个哈希包含不同的盐.速度是你的敌人,多次迭代会降低速度.每次迭代都要经常加倍(这需要捕获一个新的哈希值 - 下次更改密码时再进行.)

哦,除非您运行SSL或其他一些线路安全性,否则不要允许您的密码以纯文本形式传输.如果您只是将客户端的最终哈希值与存储的哈希值进行比较,则不允许以纯文本格式传输.您需要将一个nonce(使用过一次的数字)发送到客户端,并让它们使用生成的哈希(使用上面的步骤)散列哈希,然后它们会发送给您.在服务器端,您运行相同的过程,并查看两次哈希是否匹配.然后处置它们.有一种更好的方法,但这是最简单的方法.


单个盐(任何大小)意味着如果它们生成彩虹表(哈希字典)一次,它对数据库中的每个用户都有好处,因此它们更有可能更快地找到命中.如果每个用户具有不同的盐,则意味着需要为每个用户生成新的查找表.

3> Lou Franco..:

去年,CodingHorror有一篇很棒的文章

http://www.codinghorror.com/blog/archives/000953.html

文章末尾的建议是BCrypt



4> KovBal..:

上述算法是加密安全散列算法(但MD5今天不被认为是安全的).

但是,有一些算法专门用于从密码派生密钥.这些是关键的派生函数.它们设计用于对称密码,但它们也适用于存储密码.例如,PBKDF2使用salt,大量迭代和良好的散列函数.如果你有一个库,实现它的是什么(例如.NET),我认为你应该考虑它.



5> Adam Rosenfi..:

使用强大的密码哈希函数,如MD5或SHA1,但要确保使用好的盐,否则你会受到彩虹表攻击.



6> Wedge..:

在哈希密码值中添加唯一的salt(将salt值存储在db中).当使用独特的盐时,使用比SHA1或MD5更安全的算法的好处并不是必需的(在这一点上它是一个渐进的改进,而使用盐是一个巨大的改进).



7> Keith..:

2013年1月更新

最初的答案是从2008年开始,过去5年里情况有所改变.随时可用的云计算和强大的并行处理器图形卡意味着密码最多可达8或9个字符,因为MD5或SHA1现在可以轻松破解.

现在长盐是必须的,就像SHA512更难实现.

但是,所有SHA变体哈希都是为通信加密而设计的 - 在每条消息都被加密的情况下来回传递消息,因此它们的设计速度很快.

在密码哈希世界中,这种设计是一个很大的缺点,因为散列越快,生成大量哈希所需的时间就越少.

像SHA512这样的快速哈希可以生成数百万甚至数十亿次.投入廉价的并行处理,密码的每一种可能的排列都是绝对必要的.

键拉伸是解决这个问题的一种方法.密钥拉伸算法(如PBKDF2)应用更快的哈希(如SHA512)数千次,通常导致哈希生成花费1/5秒左右.登录的人不会注意到,但如果你每秒只能产生5次哈希暴力攻击,那就更难了.

其次应该始终存在每用户随机盐.这可以随机生成为哈希的前n个字节(然后在构建要比较的哈希值之前将其去除并添加到要检查的密码文本中)或作为额外的DB列.

所以:

我应该使用什么算法将密码哈希到我的数据库中?

键拉伸以减缓哈希生成.我可能会选择PBKDF2.

每用户盐意味着每个用户的新攻击,一些工作找出如何获得盐.

计算能力和可用性呈指数增长 - 这些规则有可能在未来4年内再次发生变化.如果您需要面向未来的安全性,我会调查bcrypt/scrypt样式哈希 - 这些采用较慢的键扩展算法并添加一个使用大量RAM来生成哈希的步骤.使用如此多的RAM会降低廉价并行处理器的效率.

2008年9月原版(留待评论有意义)

MD5 +盐或SHA1 +盐并非"易碎" - 大多数黑客都依赖于巨大的彩虹表,而这些对于盐来说变得不那么有用了[update, now they are].

MD5 +盐是一个相对较弱的选择,但它不会轻易打破[update, now it is very easy to break].

SHA2一路上升到512 - 用现成的套件破解是不可能的[update, pretty easy up to 9 char passwords now]- 尽管我确定某个军事掩体中有一个Cray可以做到这一点[You can now rent this 'Cray' from Amazon]

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有