有什么可用的东西不是很容易破碎吗?
这个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-256.
将密码与固定盐(整个数据库相同)组合在一起.
将上一步的结果与存储并附加到此记录的唯一盐(可能是用户名,记录ID,guid,长随机数等)组合在一起.
多次运行哈希算法 - 比如1000次以上.理想情况下,每次使用前一个哈希包含不同的盐.速度是你的敌人,多次迭代会降低速度.每次迭代都要经常加倍(这需要捕获一个新的哈希值 - 下次更改密码时再进行.)
哦,除非您运行SSL或其他一些线路安全性,否则不要允许您的密码以纯文本形式传输.如果您只是将客户端的最终哈希值与存储的哈希值进行比较,则不允许以纯文本格式传输.您需要将一个nonce(使用过一次的数字)发送到客户端,并让它们使用生成的哈希(使用上面的步骤)散列哈希,然后它们会发送给您.在服务器端,您运行相同的过程,并查看两次哈希是否匹配.然后处置它们.有一种更好的方法,但这是最简单的方法.
去年,CodingHorror有一篇很棒的文章
http://www.codinghorror.com/blog/archives/000953.html
文章末尾的建议是BCrypt
上述算法是加密安全散列算法(但MD5今天不被认为是安全的).
但是,有一些算法专门用于从密码派生密钥.这些是关键的派生函数.它们设计用于对称密码,但它们也适用于存储密码.例如,PBKDF2使用salt,大量迭代和良好的散列函数.如果你有一个库,实现它的是什么(例如.NET),我认为你应该考虑它.
使用强大的密码哈希函数,如MD5或SHA1,但要确保使用好的盐,否则你会受到彩虹表攻击.
在哈希密码值中添加唯一的salt(将salt值存储在db中).当使用独特的盐时,使用比SHA1或MD5更安全的算法的好处并不是必需的(在这一点上它是一个渐进的改进,而使用盐是一个巨大的改进).
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]