MD5安全性好吗?

4
我刚开始学编程,也许我错过了md5的重点。但从我的经验来看,MD5加密对于每个单词都是“静态”的。所谓“静态”,就是说例如md5(“hello”)始终会得到相同的结果。这使我认为使用库高度可逆。

如果md5(“hello”)被分配一个数字(例如5),字符串xbuIdSjsdsjsd44s64sd是它的加密,并且等于5,但是如果sfoiefef465f4ze4f6fe也是它的加密,并且也等于5呢?

因为数学计算最终都得到同样的结果。那将是动态加密吗?

我想,但我告诉你,我是个新手,所以这些只是困扰我的问题。我认为有权访问数据库md5密码的人可以通过测试单词并将其存储为库来轻松地反转它们。

你们觉得呢?是否有md5的替代方案?

感谢任何帮助或启示。


2
当你说“static”时,正确的词是“deterministic” - 相同的输入始终产生相同的输出。 - Troy Hunt
1
除了其他评论外,任何人都很难找到相当短的消息的碰撞。不过,非常简单的是创建一些数据,计算为MD5散列值,同时生成另一些数据,也可以计算为该散列值。我们在这里讨论的是几秒钟(最多)来计算。这就是为什么MD5如此脆弱,尤其是对于例如证书之类的东西。例如,您可以让CA为iwannabemaninmiddle.com创建证书,然后将其用于Google com。 - Maarten Bodewes
3个回答

8

为了存储密码,不能使用包含md5和SHA1/2(即使加盐)在内的快速哈希函数。你需要使用慢哈希,通常采用密钥派生函数的形式,以降低暴力破解的速度。PBKDF2和bcrypt是流行的选择。你还应该为每个用户使用随机盐。


速度确实不重要。所有的哈希函数都比某人的硬盘写入速度更快。 - Toskan
@Toskan 硬盘速度与密码哈希有何关系?密码哈希被故意设置为昂贵的操作,以减缓攻击者猜测密码并比较哈希值以验证其猜测的速度。 - CodesInChaos
哈希函数非常快,以至于硬盘无法写出所有的代码。你说它“慢”,但实际上它根本不慢。你可以创建很多密码,算法的缓慢完全不重要。 - Toskan
@Toskan我不明白重点在哪里。如果您使用快速哈希算法,例如MD5或SHA-1/2,则单个GPU可以每秒哈希数十亿个密码,这将使已获得您的密码哈希的攻击者能够恢复大多数密码。这就是为什么您应该使用故意缓慢的哈希算法(如bcrypt)来保护密码的原因。可以使用可调节的工作因素使其尽可能缓慢。请参阅security.se上的《如何安全地哈希密码?》(https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords)。 - CodesInChaos
我可能当时理解错了。 - Toskan

5

这确实是合理的担忧。您可能会发现以下文章有趣:

但是,安全专家认为MD5已经“破解”。这取决于您的要求是什么:MD5可能适合您,但更安全的哈希算法(如SHA-2系列)可能是更明智的选择,甚至是像PBKDF2(如CodeInChaos建议)这样的密钥强化技术。

请注意,单独选择哈希算法本身不能被视为安全或不安全。重要的是以经过验证、经过试验的方式使用哈希算法。


谢谢大家,我会阅读有关Salt、彩虹表和检查NSA的加密系统的内容。 - james

2
“MD5是否安全取决于你使用它的方式和用途。对于消息完整性,MD5已经不再适用,因为现在存在一种攻击可以找到一个具有相同哈希值的备选消息。对于在数据库中存储密码,如果你适当地salt了它,那么MD5是可接受的。对于这种用法,已知攻击并不重要。如果你处于偏执模式,也可以使用更复杂的方案,比如bcrypt,但对于大多数人来说,存储带盐的密码已经足够好了。它可以防止最简单、最明显的攻击,易于实施,难以出错,且开销较小。

请注意,在正常情况下,两个不同的密码具有相同的哈希值并不是真正的问题。这种情况很常见。话虽如此,使用SHA而不是MD5并不会增加额外的成本。它具有更多位,没有已知的攻击,并且被每个像样的库支持。”


4
在我看来,使用像bcrypt这样的慢哈希至少和使用盐一样重要。在我看来,即使使用盐,使用明文md5/sha1/sha2也是不可接受的。 - CodesInChaos
1
嗯,这取决于密码的重要性和/或你的偏执程度,以及你愿意支付多少钱。毫无疑问,bcrypt对于潜在攻击者增加了相当大的负担,但它也给你的服务器增加了相当大的负载。很难说什么是对的,什么是错的。我在互联网上有16年的服务器经验,从来没有遭受过入侵(至少没有人注意到)。在这种情况下,由于服务器必须进行计算,每个登录需要半秒钟的时间似乎有点过分。但当然,你的情况可能会有所不同。 - Damon
3
如果你将哈希负担放在客户端上,那么实际上就用另一个密码(最终哈希也只是一个“密码”)替换了原来的密码,这样做没有什么实际意义。使用 bcrypt 的原因是,在发生数据库盗窃入侵后,除了使用盐(salt)防止彩虹表攻击所有密码之外,攻击者可能会尝试逐个暴力破解密码。为此,哈希以一种愚蠢的方式变得复杂,以至于破解一个密码需要不可接受的长时间。如果客户端执行哈希,则情况就不同了。 - Damon
1
为了让bcrypt正常工作,服务器进行多次哈希处理非常重要。否则,它最多只能防止手动暴力破解或DoS攻击(人工输入密码并点击发送按钮),这种方式有点毫无意义。 - Damon
2
这取决于使用场景。服务器可以处理每小时一次的单用户登录,也可以处理每秒50个用户的登录。如果是每小时一次的情况,登录可以花费一秒或几秒钟没有问题。假设每秒钟有50个用户可能登录,而您不想为了仅仅登录而花费大量资金进行负载均衡,那么任何需要超过10-20毫秒的操作都不是一个好选择,特别是因为在某些时候该问题会变成一个反馈循环(注意到登录时间比预期长的用户会认为出现了问题,然后再次点击按钮)。 - Damon
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接