我正在研究如何知道 MD5 有碰撞,所以它不够安全。我正在寻找一些哈希算法,即使是超级计算机也需要时间来破解。所以你能告诉我什么哈希算法可以让我的密码在未来 20 年的超级计算进步中保持安全。
3 回答
使用具有可变轮数的密钥派生函数,例如bcrypt。
您今天加密的密码具有哈希困难,您自己的系统可以在不减慢速度的情况下处理这些密码,在未来 20 年更快的系统中总是容易受到攻击。但是,随着时间的推移逐渐增加轮数,您可以增加检查密码所需的工作量,这与超级计算机功能的增加成正比。您可以对现有存储的密码应用更多轮次,而无需返回原始密码。
还能再坚持20年吗?很难说:谁知道那时我们可能会有什么疯狂的量子加密和密码替换方案?但它确实适用于最后 10 个。
另请注意,拥有超级计算机并针对特定帐户的实体很容易拥有足够的权力来攻击它,以至于您永远无法保护所有密码。密码散列的目的是通过限制普通攻击者恢复密码的速度来减轻数据库泄漏造成的损害,以便在您发现泄漏并发出注意告诉每个人更改密码。但没有 100% 的解决方案。
正如其他人所说,您所问的实际上是不可能回答的。谁知道未来二十年的处理能力会有哪些突破?还是数学?
此外,您没有告诉我们许多其他重要因素,包括您要保护的威胁模型。例如,您是否试图防御攻击者获取散列密码数据库并进行离线暴力破解?具有自定义 ASIC 的攻击者试图破解一个特定密码?等等。
话虽如此,您可以做一些事情来尽可能安全和面向未来。
首先,不要只使用普通的加密哈希算法;它们的设计并未考虑到您的应用程序。事实上,它们是为具有不同要求的其他应用程序而设计的。一方面,它们很快,因为速度是散列函数的一个重要标准。在这种情况下,这对你不利。
此外,您提到的一些算法,如 MD5 或 SHA1 有弱点(一些理论,一些实际),不应该使用。
更喜欢类似bcrypt
的算法,该算法旨在通过比通用加密哈希慢得多来抵抗暴力攻击,其安全性可以根据需要进行“调整”。
或者,使用类似PBKDF2的东西。设计用于通过您选择的功能运行密码,可配置次数以及盐,这也使得暴力破解更加困难。
根据您的使用模型调整迭代计数,请记住,它越慢,您对暴力破解的安全性就越高。
在为 PBKDF 选择加密散列函数时,首选 SHA-3,或者,如果您不能使用它,则首选 SHA-2 的长变体之一:SHA-384 或 SHA-512。我会避开 SHA-256,尽管我认为在这种情况下它没有问题。
在任何情况下,尽量使用尽可能多、最好的盐;我建议您使用良好的加密安全 PRNG,并且永远不要使用小于 64 位的盐(注意:我说的是生成的盐的长度,而不是返回的值)。
这些建议会对未来 20 年有所帮助吗?谁知道——我宁愿谨慎,也会说“不”。但是,如果您需要这么长时间的安全性,您应该考虑使用密码以外的其他东西。
无论如何,我希望这会有所帮助。
对于这个问题,这里有两个迂腐的答案:
- 如果 P = NP,则可证明不存在这样的散列函数(反之亦然,顺便说一句)。由于在撰写本文时尚未证明 P != NP,因此我们不能对此性质做出任何强有力的保证。
- 话虽如此,我认为可以肯定地说,在未来 20 年内开发的超级计算机将需要“时间”来破解你的哈希,不管它是什么。即使它是纯文本的,I/O 也需要一些时间。
因此,您的问题的答案是肯定的和否定的:)