【发布时间】:2010-09-12 02:44:56
【问题描述】:
是否有任何东西不易损坏?
【问题讨论】:
-
未来读者请注意:此信息已经过时了。 Read this question on the IT Security Stack Exchange site 获取最新信息。
标签: security encryption passwords hash
是否有任何东西不易损坏?
【问题讨论】:
标签: security encryption passwords hash
MD5 / SHA1 哈希都是不错的选择。 MD5 比 SHA1 稍弱。
【讨论】:
CodingHorror 去年有 a great article on this。文末推荐bcrypt.
【讨论】:
MD5 或 SHA 与每个条目的随机生成的盐值相结合
【讨论】:
使用强大的加密哈希函数,如 MD5 或 SHA1,但请确保使用良好的 salt,否则您将容易受到 rainbow table 攻击。
【讨论】:
所有散列算法都容易受到“字典攻击”的影响。这只是攻击者拥有一个非常大的可能密码字典的地方,并且他们对所有密码进行了哈希处理。然后,他们查看这些哈希中是否有任何与他们要解密的密码的哈希匹配。这种技术可以轻松测试数百万个密码。这就是为什么您需要避免使用任何可远程预测的密码。
但是,如果您愿意接受字典攻击的威胁,MD5 和 SHA1 就足够了。 SHA1 更安全,但对于大多数应用程序来说,这确实不是一个显着的改进。
【讨论】:
这个 2008 年的答案现在已经过时了。 SHA(所有变体)现在很容易被破解,现在(截至 2013 年 1 月)最佳实践是使用密钥拉伸哈希(如PBKDF2) 或理想情况下是 RAM 密集型的(如 Bcrypt),并添加每个用户的盐。
第 2 点、第 3 点和第 4 点仍然值得关注。
请参阅IT Security SE site 了解更多信息。
2008 年原始答案:
使用经过验证的算法。 SHA-256 在数据库中使用 64 个字符,但在列上的索引没有问题,它是经过验证的哈希,比 MD5 和 SHA-1 更可靠。作为标准安全套件的一部分,它也以大多数语言实现。但是,如果您使用 SHA-1,请不要难过。
不要只是散列密码,还要将其他信息放入其中。您经常使用“username:password:salt”或类似的哈希值,而不仅仅是密码,但如果您使用它,那么您会更难进行字典攻击。
安全是一个艰难的领域,不要认为你可以发明自己的算法和协议。
不要写像“[AddUser] Hash of GeorgeBush:Rep4Lyfe:ASOIJNTY is xyz”这样的日志
【讨论】:
将unique salt 添加到哈希密码值(将盐值存储在数据库中)。当unique salt is used 使用比 SHA1 或 MD5 更安全的算法的好处时,实际上并没有必要(此时它是一种渐进式改进,而使用盐是一项巨大的改进)。
【讨论】:
2013 年 1 月更新
最初的答案是 2008 年,过去 5 年发生了一些变化。云计算和强大的并行处理器图形卡的现成可用性意味着密码最多 8 或 9 个字符散列为 MD5 或 SHA1 现在可以轻松破解。
现在必须使用长盐,就像 SHA512 这样更坚固的盐。
然而,所有 SHA 变体哈希都是为通信加密而设计的 - 来回消息,其中每条消息都被加密,因此它们被设计为 快速。
在密码散列世界中,这种设计是一个很大的缺点,因为生成散列的速度越快,生成大量散列所需的时间就越少。
像 SHA512 这样的快速哈希每秒可以生成数百万甚至数十亿次。投入廉价的并行处理,密码的每一种可能的排列都成为绝对必须的。
按键拉伸是解决此问题的一种方法。密钥拉伸算法(如 PBKDF2)应用更快的哈希(如 SHA512)数千次,通常会导致哈希生成需要 1/5 秒左右。登录的人不会注意到,但如果你每秒只能生成 5 个哈希值,那么暴力攻击就更难了。
其次,应该始终是每个用户的随机盐。这可以随机生成为散列的前 n 个字节(然后将其剥离并添加到密码文本中以在构建散列进行比较之前进行检查)或作为额外的 DB 列。
所以:
我应该使用什么算法将密码散列到我的数据库中?
键拉伸以减慢哈希生成速度。我可能会选择 PBKDF2。
Per-user salt 意味着每个用户的新攻击,以及一些工作来弄清楚如何获取 salt。
计算能力和可用性呈指数级增长 - 这些规则很可能在 4 年后再次发生变化。如果您需要面向未来的安全性,我会研究 bcrypt/scrypt 风格的哈希 - 这些采用较慢的密钥拉伸算法并添加一个使用大量 RAM 来生成哈希的步骤。使用如此多的 RAM 会降低廉价并行处理器的效率。
原件 2008 年 9 月(留下来让 cmets 有意义)
MD5+salt 或 SHA1+salt 不是“容易破解的”——大多数 hack 依赖于巨大的彩虹表,而使用 salt [update, now they are] 时,这些就变得不那么有用了。
MD5+salt 是一个相对较弱的选项,但不会轻易被破解[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 现在不被认为是安全的)。
但是,有一些算法专门用于从密码中派生密钥。这些是key derivation functions。它们是为与对称密码一起使用而设计的,但它们也适用于存储密码。 PBKDF2 例如使用盐、大量迭代和良好的散列函数。如果你有一个库,是什么实现它(例如 .NET),我认为你应该考虑它。
【讨论】:
密码学和密码存储的第一条规则是“不要自己发明”,但如果你必须这样做,这里是你必须做的绝对最低限度的安全措施:
基本规则:
步骤:
哦,除非您正在运行 SSL 或其他线路安全,否则请不要让您的密码以纯文本形式传输。如果您只是将来自客户端的最终哈希值与您存储的哈希值进行比较,那么也不允许以纯文本形式传输它。您需要向客户端发送一个随机数(使用一次的数字),并让他们使用生成的哈希(使用上述步骤)哈希对其进行哈希处理,然后他们将其发送给您。在服务器端,您运行相同的进程并查看两个一次性哈希是否匹配。然后处理掉它们。有更好的方法,但这是最简单的方法。
【讨论】:
:。所以你的领域从aabbccddeeaabbccddeeaabbccddeeaabbccddee 到sLt:fb1337ce1afb1337ce1afb1337ce1afb1337ce1a。如果您愿意,可以交换两个子字段的顺序,但关键是,稍后解析的成本很低,并且大大提高了安全性。
【讨论】: