9

我在 SO 上看到 一些 问题答案,表明 MD5 不如 SHA 之类的安全。

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

这是我如何使用它的示例:

  1. 在客户端,我通过附加当前时间和密码,然后使用 MD5 对其进行哈希处理,为消息提供“安全”校验和。所以:MD5(message+time+password)
  2. 在服务器端,我正在使用我对发送时间和客户端密码的了解,对照发送的消息检查此哈希。

在这个例子中,使用 SHA 而不是 MD5 真的更好吗?

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

编辑:

澄清一下——在我的例子中,转向 SHA 算法有什么好处吗?

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

更多编辑:

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

4

11 回答 11

30

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

现在,这需要他们使用 PlayStation 3 集群花费大量时间和精力,并且需要数周时间才能找到合适的碰撞。但是一旦被破坏,哈希算法只会变得更糟,永远不会更好。如果您完全关心安全性,最好选择完整的哈希算法,例如SHA-2 系列之一(SHA-1 也已被削弱,尽管没有 MD5 那样严重损坏)。

编辑:我为您提供的链接中使用的技术涉及能够选择两个任意消息前缀和一个公共后缀,它可以从中为每个前缀生成一个可以插入该前缀和公共后缀之间的数据块,生成与从另一个前缀构造的消息具有相同 MD5 和的消息。我想不出在您描述的情况下可以利用此特定漏洞的方法,并且通常,使用安全设备进行消息身份验证比将其用于数字签名更能抵抗攻击,但我能想到一些您需要注意的漏洞,这些漏洞大多与您选择的哈希无关。

  1. 如前所述,您的算法涉及将密码以纯文本形式存储在服务器上。这意味着您很容易受到任何能够在服务器上发现密码的信息泄露攻击。您可能认为如果攻击者可以访问您的数据库,那么游戏就结束了,但您的用户可能更愿意即使您的服务器受到威胁,他们的密码也不会被破坏。由于在线密码的激增,许多用户跨服务使用相同或相似的密码。此外,即使在代码执行或特权升级攻击不存在的情况下,也可能发生信息泄露攻击。

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

  2. 如果攻击者可以嗅探客户端发送的消息,他可以对客户端的密码进行离线字典攻击。大多数用户的密码具有相当低的熵,一个包含几十万现有密码的好字典加上一些随机排列的时间可以让攻击者从嗅探消息中获得的信息很容易找到密码。

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

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

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

如果这被用于安全性真正重要的事情,那么不要发明自己的身份验证系统。只需使用TLS/SSL。密码学的基本规则之一是不要发明自己的. 然后,即使在论坛的情况下,它可能并不重要,使用现成的东西比滚动你自己的东西更容易吗?

于 2009-04-21T03:22:01.363 回答
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(message + time + md5(password)),您可以安全地将 md5(password) 存储在数据库中。但是,窃取您的数据库的攻击者(通过 SQL 注入之类的方式)仍然能够伪造消息。我看不出有什么办法。

于 2009-04-21T04:31:09.993 回答
8

布赖恩的回答涵盖了这些问题,但我确实认为需要稍微详细地解释一下

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

MD5 在这里不对,Sha1 在这里用错 Sha2xx 用错了,Skein 用错了。

您应该使用的是RSA 之类的东西。

让我解释:

您的安全哈希有效地将密码发送给全世界。

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

取而代之的是,您应该查看公钥密码术,让您的服务器将公钥发送给您的代理,并让代理使用公钥加密数据。

中间没有人能够分辨消息中的内容,也没有人能够伪造消息。

另一方面,MD5 在大多数情况下都非常强大。

于 2009-05-04T02:26:06.290 回答
5

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

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

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

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

于 2009-04-21T03:19:24.630 回答
2

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

这有多普遍?2007 年,来自荷兰的一个团体宣布,他们在 MD5 哈希值为3D515DEAD7AA16560ABA3E9DF05CBC80的文件中预测了 2008 年美国总统大选的获胜者。然后,他们创建了 12 个文件,除了候选人的姓名和后面的任意数量的空格外,所有文件都相同,这些文件哈希到该值。MD5 哈希值作为校验和毫无价值,因为太多不同的文件给出相同的结果。

如果我没看错的话,这与您的情况相同。只需将“候选人姓名”替换为“密码”即可。如果您真的想要安全,您可能应该使用不同的哈希函数。

于 2009-04-21T04:29:58.610 回答
1

如果您要生成哈希 MAC,请不要发明您的方案。使用HMAC。做 HASH(secret-key || message) 和 HASH(message || secret-key) 存在问题。如果您使用密码作为密钥,您还应该使用密钥派生函数。看看pbkdf2

于 2009-04-21T09:29:55.893 回答
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 是针对您所描述的情况而设计的,并已进行了相应的分析。

于 2009-05-08T02:54:15.237 回答
0

以这种方式使用 MD5 并没有什么不安全的地方。MD5 只是在某种意义上被破坏了,有一些算法可以在给定一堆数据 A 的情况下生成额外的数据 B 来创建所需的散列。这意味着,如果有人知道密码的哈希值,他们可以生成一个字符串,该字符串将产生该哈希值。不过,这些生成的字符串通常很长,因此如果您将密码限制为 20 或 30 个字符,您仍然可能是安全的。

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

于 2009-04-21T03:21:30.130 回答
0

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

SHA家族以可靠性着称,SHA1是日常使用的标准,而SHA256/SHA512是政府和银行设备的标准。

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

您可以查看有关MD5SHA的维基百科文章

于 2009-04-21T03:34:46.697 回答
0

MD5 和 SHA-1 都具有加密弱点。MD4 和 SHA-0 也受到威胁。

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

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

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

于 2009-05-05T02:37:54.083 回答
0

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

如果有人在您的数据库中四处寻找,那么他们可能很想查看您的密码哈希,但他们很可能想要窃取您可能在其他表中的个人信息或任何其他数据。坦率地说,在这种情况下,你有更大的鱼要炸。

我并不是说忽略这个问题,就像我说的那样,这与你是否应该使用 MD5、SHA1 或其他任何东西来散列密码并没有太大关系,但我每次阅读时都会微微发痒有人对数据库中的纯文本密码感到有些不安。

于 2009-05-08T01:36:27.873 回答