MD5的安全性是否低于SHA等。人。在实际意义上?

时间:2009-04-21 03:12:47

标签: security hash md5 sha

我在SO上看到a few questionsanswers表示MD5不像SHA那样安全。

我的问题是,这在我的情况下值得担心吗?

以下是我如何使用它的示例:

  1. 在客户端,我通过附加当前时间和密码然后使用MD5对其进行散列来为消息提供“安全”校验和。所以:MD5(message+time+password)
  2. 在服务器端,我正在根据我发送的时间和客户端密码的信息检查此哈希值。
  3. 在这个例子中,我真的更喜欢使用SHA而不是MD5吗?

    在什么情况下,实际意义上的散列函数的选择真的很重要?

    修改

    为了澄清 - 在我的示例中 ,移植到SHA算法有什么好处吗?

    换句话说,在这个例子中,有人在不知道共享密码的情况下发送消息和正确的散列是否可行?

    更多编辑:

    重复编辑的道歉 - 我不清楚我在问什么。

11 个答案:

答案 0 :(得分:29)

是的,在实践中值得担心。 MD5严重破坏,researchers能够伪造与证书颁发机构签署的真实证书相匹配的假证书。这意味着他们能够创建自己的假证书颁发机构,因此可以冒充他们认为对浏览器完全信任的任何银行或企业。

现在,这需要他们花费大量时间和精力使用一组PlayStation 3,并花费数周时间来找到适当的碰撞。但是一旦破坏,哈希算法只会变得更糟,永远不会更好。如果您完全关心安全性,最好选择一个完整的哈希算法,例如SHA-2 family之一(SHA-1也被削弱了,虽然没有像MD5那样严重破坏)。

编辑:我提供给您的链接中使用的技术包括能够选择两个任意消息前缀和一个公共后缀,从中可以为每个前缀生成一个可以生成的数据块插入在该前缀和公共后缀之间,以产生与从另一个前缀构造的消息具有相同MD5总和的消息。我无法想到在您描述的情况下可以利用这种特定漏洞的方式,并且通常使用message authentication的安全版本比使用数字签名更能抵御攻击,但我可以想到您需要注意的一些漏洞,这些漏洞大多与您选择的哈希值无关。

  1. 如上所述,您的算法涉及在服务器上以明文形式存储密码。这意味着您容易受到任何可能在服务器上发现密码的信息泄露攻击。您可能会认为,如果攻击者可以访问您的数据库,那么游戏就会启动,但即使您的服务器遭到入侵,您的用户也可能更喜欢他们的密码。由于在线密码的激增,许多用户在服务中使用相同或类似的密码。此外,即使在代码执行或特权升级攻击不是的情况下,也可能发生信息泄露攻击。

    您可以通过在服务器上存储使用随机盐进行哈希处理的密码来缓解此攻击;将对<salt,hash(password+salt)>存储在服务器上,并将salt发送到客户端,以便它可以计算hash(password+salt)来代替您提到的协议中的密码。但是,这并不能保护您免受下一次攻击。

  2. 如果攻击者可以嗅探客户端发送的消息,他可以对客户端的密码进行离线字典攻击。大多数用户拥有相当低的熵密码,并且一个包含数十万现有密码的良好字典以及随机排列它们的一些时间可以根据攻击者通过嗅探消息非常容易获得的信息来查找密码。

  3. 您建议的技术不会对服务器进行身份验证。我不知道这是否是您正在谈论的网络应用程序,但如果是,那么可以执行DNS劫持攻击,或在不安全的无线网络上进行DHCP劫持的人,或者其他任何类型的人都可以做中间人攻击,他们从客户那里以明文收集密码。

  4. 虽然目前针对MD5的攻击可能不会对您描述的协议产生影响,但MD5已经严重受损,并且散列只会越来越弱,永远不会变强。你想打赌你会发现可以用来攻击你的新攻击,并且在攻击者有机会利用它之前有时间升级哈希算法吗?从目前比MD5更强的东西开始可能更容易,以减少你不得不进一步打破MD5的机会。

  5. 现在,如果您只是这样做是为了确保没有人在论坛或其他东西上伪造来自其他用户的消息,那么肯定的是,任何人都不可能花费时间和精力来破坏您描述的协议。如果有人真的想冒充其他人,他们可能只是创建一个新的用户名,使用Unicode代替O或者更相似的东西,甚至不用去尝试伪造消息和破坏哈希算法。< / p>

    如果将此用于安全性非常重要的事情,那么请不要发明自己的身份验证系统。只需使用TLS/SSL即可。密码学的基本规则之一是not to invent your own。然后,即使对于论坛的情况来说,这可能并不重要,仅仅使用经过验证的东西而不是滚动自己的东西会不会更容易?

答案 1 :(得分:12)

在这种特殊情况下,我认为您的应用程序使用md5而不是sha的最薄弱环节。 md5被“破坏”的方式是,假设md5(K)= V,则可以生成K',使得md5(K')= V,因为输出空间是有限的(不是因为有任何减少搜索空间的技巧)。但是,K'不一定是K.这意味着如果你知道md5(M + T + P)= V,你就可以生成P',使得md5(M + T + P')= V,这给出了一个有效的条目。但是,在这种情况下,消息仍然保持不变,并且P没有受到损害。如果攻击者试图用T'时间戳伪造消息M',则除非P'= P,否则md5(M'+ T'+ P')= md5(M'+ T'+ P)的可能性极小。在这种情况下,他们会强制密码。如果他们有强制密码,那么这意味着你使用sha或md5并不重要,因为检查md5(M + T + P)= V是否相当于检查sha(M + T + P) )= V.(除了sha可能需要更长的时间来计算,这不会影响P上蛮力的复杂性。)

然而,鉴于选择,你真的应该继续使用sha。没有使用它是没有意义的,除非使用它有严重的缺点。

第二件事是您可能不应该以纯文本格式将用户密码存储在数据库中。您应该存储的是密码的哈希值,然后使用它。在您的示例中,哈希值为:md5(message + time + md5(password)),您可以安全地将md5(密码)存储在数据库中。但是,攻击者窃取您的数据库(通过SQL注入之类的东西)仍然可以伪造消息。我没有看到任何解决方法。

答案 2 :(得分:8)

布赖恩的回答涵盖了这些问题,但我确实认为需要对其进行详细解释

您在这里使用了错误的加密算法

MD5在这里是错误的,Sha1在这里使用错误Sha2xx使用错误且使用Skein错误。

你应该使用的是like RSA

让我解释一下:

您的安全哈希有效地发送密码供全世界查看。

如果第三方获得有效负载的副本并知道时间,那么您提到您的哈希是“时间+有效负载+密码”。它可以找到密码(使用蛮力或字典攻击)。所以,它几乎就像你以明文形式发送密码一样。

您应该查看public key cryptography服务器向您的代理发送公钥并让代理使用公钥加密数据,而不是这样。

中间的任何人都无法告诉消息中的内容,也没有人能够伪造消息。

在旁注,MD5 is plenty strong大部分时间。

答案 3 :(得分:5)

这取决于消息内容的价值。 SHA系列显然比MD5更安全(“更安全”意味着“更难伪造”),但如果您的消息是Twitter更新,那么您可能不在乎。

如果这些消息是处理金融交易的分布式系统的IPC层,那么也许你更关心。

更新:我还应该补充一点,两个摘要算法在很多方面基本上是可以互换的,那么使用更安全的算法真的会有多麻烦呢?

更新2:这是一个更彻底的答案:http://www.schneier.com/essay-074.html

答案 4 :(得分:2)

是的,有人可以在不知道共享密码的情况下发送消息和正确的哈希。他们只需要找到一个哈希值相同的字符串。

这有多常见? 2007年,来自荷兰的一个团体宣布,他们已经预测了2008年美国总统选举的获胜者,该文件的MD5哈希值为3D515DEAD7AA16560ABA3E9DF05CBC80。然后他们创建了十二个文件,除了候选人的名字和随后的任意数量的空格之外,所有文件都是相同的,这些文件都是哈希值。 MD5哈希值作为校验和毫无价值,因为太多不同的文件会产生相同的结果。

如果我正确地读你,这和你的情况是一样的。只需用“密码”替换“候选人姓名”即可。如果你真的想要安全,你应该使用不同的哈希函数。

答案 5 :(得分:1)

如果您要生成hash-mac,请不要发明您的方案。使用HMAC。做HASH(秘密密钥||消息)和HASH(消息||秘密密钥)有问题。如果您使用密码作为密钥,您还应该使用密钥派生函数。看看pbkdf2

答案 6 :(得分:1)

是的,值得担心在这种情况下使用哪个哈希。我们先来看看攻击模型。攻击者可能不仅尝试生成值md5(M + T + P),还可能尝试查找密码P.特别是,如果攻击者可以收集值为M i 的值,则T i ,以及相应的md5(M i ,T i ,P)然后他/她可能会尝试找到P.这个问题还没有广泛研究哈希函数如发现碰撞。我解决这个问题的方法是尝试使用与块密码相同类型的攻击:例如差别攻击。由于MD5已经非常容易受到差异攻击,我当然可以想象这样的攻击在这里可以成功。

因此我建议你在这里使用比MD5更强的哈希函数。我还建议您使用HMAC而不是md5(M + T + P),因为HMAC是针对您描述的情况而设计的,因此已经过分析。

答案 7 :(得分:0)

以这种方式使用MD5并没有什么不安全感。 MD5只是在某种意义上被打破,有一些算法,给定一堆数据可以生成额外的数据B来创建所需的哈希。意思是,如果有人知道密码的哈希值,他们可能会生成一个字符串,该字符串将使用该哈希值。虽然,这些生成的字符串通常很长,所以如果你将密码限制在20或30个字符,你仍然可能是安全的。

使用SHA1而非MD5的主要原因是MD5功能正在逐步淘汰。例如,Silverlight .Net库不包含MD5加密提供程序。

答案 8 :(得分:0)

MD5提供的冲突比SHA更多,这意味着某人实际上可以从不同的单词获得相同的哈希值(但很少)。

SHA系列以其可靠性而闻名,SHA1已成为日常使用的标准,而SHA256 / SHA512则是政府和银行设备的标准。

对于您的个人网站或论坛,我建议您考虑SHA1,如果您创建更严肃的商业,我建议您使用SHA256 / SHA512(SHA2系列)

您可以查看维基百科关于MD5&amp;的文章。 SHA

答案 9 :(得分:0)

MD5和SHA-1都有加密弱点。 MD4和SHA-0也受到了损害。

您可以安全地使用MD6,Whirlpool和RIPEMD-160。

请参阅普林斯顿大学的以下powerpoint,向下滚动到最后一页。

http://gcu.googlecode.com/files/11Hashing.pdf

答案 10 :(得分:0)

我不打算评论MD5 / SHA1 /等。问题,所以也许你会认为这个答案没有实际意义,但是每当使用MD5等人时,让我感到非常轻松的东西。用于在数据库中散列密码。

如果某人在您的数据库中徘徊,那么他们可能非常希望查看您的密码哈希值,但他们可能会想要窃取您可能在其他地方存在的个人信息或任何其他数据。表。坦率地说,在那种情况下,你有更大的鱼要炒。

我不是说忽略这个问题,就像我说的那样,这对你是否应该使用MD5,SHA1或者其他任何东西来破坏你的密码并没有太大的影响,但我确实得到了一点点粉红色我读到有人对数据库中的纯文本密码感到有些不安。