Jee*_*Bee 43
这个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"
Jim*_*eth 32
密码学和密码存储的第一条规则是" 不要自己发明 ",但如果你必须在这里绝对最低限度,那么你必须做的就是有任何相似的安全性:
基本规则:
脚步:
哦,除非您运行SSL或其他一些线路安全性,否则不要允许您的密码以纯文本形式传输.如果您只是将客户端的最终哈希值与存储的哈希值进行比较,则不允许以纯文本格式传输.您需要将一个nonce(使用过一次的数字)发送到客户端,并让它们使用生成的哈希(使用上面的步骤)散列哈希,然后它们会发送给您.在服务器端,您运行相同的过程,并查看两次哈希是否匹配.然后处置它们.有一种更好的方法,但这是最简单的方法.
Lou*_*nco 15
去年,CodingHorror有一篇很棒的文章
http://www.codinghorror.com/blog/archives/000953.html
文章末尾的建议是BCrypt
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]