有没有什么东西是不容易被轻易破解的?
有没有什么东西是不容易被轻易破解的?
这个2008年的回答现在已经严重过时了。 SHA(所有变种)现在可以轻松破解,现在最好的做法是(截至2013年1月)使用一个密钥伸展哈希(例如PBKDF2)或理想情况下使用内存密集型加密(例如Bcrypt),并添加每个用户的盐。
点2、3和4仍然值得关注。
有关更多信息,请参见IT Security SE网站。
原始2008年的回答:
使用经过验证的算法。SHA-256在数据库中使用64个字符,但在该列上建立索引后,这不是问题,并且它是一种经过验证的哈希,比MD5和SHA-1更可靠。它也作为标准安全套件的一部分在大多数语言中实现。但是如果您使用SHA-1也不要感到难过。
不要只散列密码,还要将其他信息放入其中。通常使用“用户名:密码:salt”的哈希值或类似哈希值,而不仅仅是密码,但是如果您玩弄此类操作,则使其更难攻击字典。
安全是一个艰难的领域,不要认为您可以发明自己的算法和协议。
不要编写类似于“[AddUser] GeorgeBush:Rep4Lyfe:ASOIJNTY的哈希值为xyz”这样的日志
密码学和密码存储的第一条规则是“不要自己发明”,但如果你必须这样做,以下是维护任何安全性相似度所需的最低限度:
基本准则:
步骤:
哦,如果你没有运行SSL或其他安全线路,请不要允许密码以明文形式传输。而且如果您只是将客户端的最终哈希与您存储的哈希进行比较,则也不要以明文形式传输。您需要向客户端发送一个一次性数字(nonce),并要求他们使用上述步骤生成的哈希与其生成的哈希一起对其进行哈希,然后将其发送给您。在服务器端,您运行相同的过程,并查看两个一次性散列是否匹配。然后处理掉它们。这里有一种更好的方法,但这是最简单的方法。
aabbccddeeaabbccddeeaabbccddeeaabbccddee
变为sLt:fb1337ce1afb1337ce1afb1337ce1afb1337ce1a
。如果您想要交换两个子字段的顺序,则可以这样做,但关键是它很容易解析,而且可以大幅提高安全性。 - maxwellbCodingHorror在去年发布了一篇有关此事的优秀文章。该文章最后的建议是使用bcrypt。
2013年1月更新
原始答案发布于2008年,过去5年中情况有所变化。云计算和强大的并行处理图形卡的普及意味着,使用MD5或SHA1哈希的密码长度为8或9个字符现在很容易被破解。
现在必须使用较长的盐,并且需要像SHA512这样更强的加密方式。
然而,所有SHA变体哈希都是为通信加密而设计的 - 来回传递的消息每条消息都加密了,因此它们被设计成快速。
在密码哈希世界中,这种设计是一个很大的劣势,因为哈希生成得越快,生成大量哈希所需的时间就越少。像SHA512这样的快速哈希可以每秒生成数百万甚至数十亿次。加入廉价的并行处理,每个可能的密码排列组合都成为了绝对必要的。
键拉伸是应对这种情况的一种方法。键拉伸算法(如PBKDF2)将快速哈希(如SHA512)应用于数千次,通常导致哈希生成约需要1/5秒左右。登录的人不会注意到,但如果您只能每秒生成5个哈希,暴力攻击就会更加困难。
其次,始终应该有一个针对每个用户的随机盐。这可以随机生成为哈希的前n个字节(然后将其剥离并添加到要检查的密码文本中,以便构建要比较的哈希)或作为额外的DB列。
所以:
我应该使用什么算法将密码哈希到我的数据库中?
键拉伸以减慢哈希生成速度。我可能会选择PBKDF2。
针对每个用户的盐意味着每个用户都需要一次新的攻击,并且需要一些工作来确定如何获取盐。
计算能力和可用性呈指数级增长 - 很可能这些规则在另外4年内会再次改变。如果您需要具有未来保障的安全性,我建议调查bcrypt / scrypt样式的哈希 - 这些哈希采用较慢的键拉伸算法,并添加了一步使用大量RAM来生成哈希。使用这么多RAM会降低廉价并行处理器的效果。
原始答案(2008年9月发布,保留以便评论有意义)
MD5 +盐或SHA1 +盐不是“轻松破解”的 - 大多数黑客都依赖于巨大的彩虹表,而这些表在使用盐后变得不太有用 [更新,现在它们]
。
MD5 +盐是一个相对较弱的选项,但不会很容易被破解 [更新,现在它非常容易被破解]
。
SHA2可以达到512位 - 这将非常难以使用现成的工具破解[更新,现在容易破解长度为9个字符的密码]
- 虽然我相信某些军事掩体中可能有一台Cray可以做到这一点[你现在可以从亚马逊租用这台'Cray']
使用MD5或SHA与每个条目随机生成的盐值相结合
所有哈希算法都容易受到"字典攻击"的威胁。攻击者会拥有一个非常大的可能密码字典,然后对其中所有密码进行哈希运算。接着,他们会查看这些哈希值是否与他们想要解密的密码的哈希值匹配。这种技术可以轻松测试数百万个密码。因此,您需要避免使用任何可能被预测的密码。
但是,如果您愿意承担字典攻击的威胁,MD5和SHA1都足够安全。SHA1更加安全,但对于大多数应用程序来说,这并没有显著的改进。