这个问题已经在这里有一个答案:
- 安全的密码哈希 9个回答
有什么可说是不平凡易碎?
这个问题已经在这里有一个答案:
有什么可说是不平凡易碎?
这2008年的答案是现在危险已经过时了。 SHA(所有变体)现在是平凡易碎,现在最好的做法是(以2013年1月的),用一键拉伸哈希(如PBKDF2)或理想的一个RAM密集型(如Bcrypt ),并增加每个用户的盐太。
分2,3和4仍值得关注。
请参阅IT安全SE网站更多。
原来2008年的答案:
使用经过验证的算法。 SHA-256使用64个字符在数据库中,但与上是没有问题的列的索引,并且它是一个成熟的散列,并且比MD5和SHA-1更可靠。 它在大多数语言也实现为标准的安全套件的一部分。 如果你使用SHA-1但不心疼。
不要只是哈希密码,但把其他信息一样好。 你经常使用的哈希值“用户名:密码:盐”或类似的,而不仅仅是密码,但如果你玩这个,然后你把它更难运行字典攻击。
安全是一个艰难的领域,不认为你可以发明自己的算法和协议。
“:Rep4Lyfe:ASOIJNTY是XYZ [ADDUSER] GeorgeBush的哈希” 不要写这样的日志
密码学和密码存储第一个规则是“ 不自己编造的 ,”但如果你必须在这里是绝对最低,你必须做的有保障的任何假象:
基本规则:
脚步:
哦,除非你正在运行的SSL或其他一些线路的安全性,那么请不要让你的密码以明文传输。 如果你只从客户端比较最终散列到您存储的散列然后不允许以纯文本既可以传输。 您需要发送一个随机数(使用一次的数字)给客户,让他们凑与他们产生的散列(使用上述步骤)哈希,然后他们给你的那一个。 在服务器端运行相同的过程,并查看这两个一次哈希保持一致。 并予以妥善处理。 有一个更好的办法,但是这是最简单的一个。
CodingHorror有这个去年一个伟大的文章
http://www.codinghorror.com/blog/archives/000953.html
在文章末尾的建议是BCrypt
上述算法加密安全散列算法(MD5,但不认为是安全的今天)。
然而有算法,该专门创建从口令导出密钥。 这是密钥导出函数 。 它们设计用于与对称密码使用,但它们是很好的用于存储的密码了。 PBKDF2例如使用盐,大量迭代,和良好的散列函数。 如果你有一个图书馆,有什么实现它(如.NET),我想你应该考虑一下。
一个添加独特盐到哈希密码值(存储在DB中的盐值)。 当一个独特的盐被用于使用比SHA1算法更安全算法的利益或MD5是不是真的有必要(在这一点上它是一个渐进的改善,而使用的盐是一个巨大的进步)。
使用如MD5或者SHA1强烈crytographic哈希函数,但要确保你使用一个很好的盐 ,否则你会很容易受到彩虹表攻击。
更新2013年1月
原来答案是从2008年,事情已经在过去的5年移动了一下。 云计算和强大的并行处理器的图形卡的现成的可用性意味着口令高达散列MD5或SHA1 8或9的字符现在平凡易碎。
现在长的盐是必须的,因为是强硬的东西像SHA512。
但是,所有的SHA哈希变型是专为通讯加密-邮件来回,每一个消息是加密的,因此,它们被设计为快 。
在密码散列世界这个设计是一个很大的缺点,因为更快的散列的产生需要产生大量的哈希值的时间更少。
像SHA512快速散列可以产生上百万,甚至数十亿次。 再加上价格便宜的并行处理和密码的每一种可能的排列变得绝对必要的。
关键拉伸是对抗的方式之一。 一个关键的拉伸算法(如PBKDF2)施加散列更快(如SHA512)几千倍,典型地使所述散列生成采取一秒钟左右的1/5。 有人登录不会注意到,但如果你只能每秒产生强力攻击5个哈希困难得多。
其次,应该永远是每个用户随机盐。 这可以作为散列的前n个字节是随机产生的或作为额外DB柱(其然后剥离并添加到密码文本建立散列比较前要检查)。
所以:
我应该使用什么算法来散列密码到我的数据库?
关键拉伸到哈希生成减慢。 我可能会与PBKDF2去。
每用户盐是指每个用户一个新的攻击,以及一些工作搞清楚如何得到盐。
计算能力和可用性成倍上升 - 没准规则将在另外4年后又改变。 如果您需要面向未来的安全性我调查bcrypt / scrypt风格哈希 - 这些都需要速度较慢的关键拉伸算法,并添加使用大量的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]
MD5或SHA与用于每个条目随机生成盐值组合
如前面提到的简单散列算法不应该被用在这里的原因:
http://arstechnica.com/security/2012/08/passwords-under-assault/
所以用别的东西,如http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx
所有的散列算法很容易受到“字典攻击”。 这简直是在攻击者具有非常大的字典可能的密码,他们哈希他们。 然后,他们看看是否有这些散列的匹配,他们希望解密的密码的哈希值。 这种技术可以轻松地测试以百万计的密码。 这就是为什么你需要避免任何可能被远程预见的任何密码。
但是,如果你愿意接受字典攻击的威胁,MD5和SHA1将每个绰绰有余。 SHA1更安全,但对于大多数应用,这实在不是一个显著的改善。
MD5 / SHA1哈希都是很好的选择。 MD5比SHA1略弱。