两条消息具有相同 MD5 摘要和相同 SHA1 摘要的可能性有多大?

Posted

技术标签:

【中文标题】两条消息具有相同 MD5 摘要和相同 SHA1 摘要的可能性有多大?【英文标题】:What are the chances that two messages have the same MD5 digest and the same SHA1 digest? 【发布时间】:2010-11-22 07:42:54 【问题描述】:

给定两条不同的消息,A 和 B(可能是 20-80 个字符的文本,如果大小很重要的话),A 的 MD5 摘要与 B 的 MD5 摘要相同的概率是多少 A 的 SHA1 摘要与 B 的 SHA1 摘要相同?那就是:

(MD5(A) == MD5(B)) && (SHA1(A) == SHA1(B))

假设没有恶意,即选择消息的目的不是为了发现冲突。我只是想知道这种情况自然发生的几率。

我认为机会“非常低”,但我不确定如何验证这一点。

更多信息:可能的消息池的大小受到限制,但很大(数亿)。生日悖论正是我所担心的。

【问题讨论】:

这个问题真的没有意义。 SHA-1 比 MD5 强,所以任何碰撞的概率对于 SHA-1 来说都更低.... @Mitch 并且对于给定消息两者发生冲突的概率小于任何一个发生冲突的概率。 我认为他的观点是 OP 使用两者的原因是为了进一步减少碰撞的机会 - 如果在 MD5 中发生碰撞,希望不会与SHA-1 的不同算法。不必太吝啬。 如果目标是减少冲突的机会,只需使用生成更大摘要的散列系统即可。像 SHA-256、SHA-384 或 SHA-512。 @fantius 问题可能是(取决于应用程序)SHA-256、SHA-384、SHA-512 1) 计算时间更长,2) 生成的哈希比串联占用更多空间MD5 和 SHA-1,和/或 3) 部署的系统具有 MD5 和 SHA-1 的硬件,但没有其他硬件。这是一个非常有效的问题。 【参考方案1】:

假设随机字符串在 MD5 和 SHA-1 哈希范围内均匀分布(事实并非如此),并假设我们只讨论两个字符串而不是字符串池(因此我们避免生日悖论类型的复杂性):

一个 MD5 散列是 128 位宽,SHA-1 是 160。根据上述假设,如果两个散列冲突,两个字符串 A 和 B 就有冲突 P 的概率。所以

P(both collide) = P(MD5 collides) * P(SHA-1 collides)

还有

P(MD5 collides) = 1/(2^128)
P(SHA-1 collides) = 1/(2^160)

所以

P(both) = 2^-128 * 2^-160 = 2^-288 ~= 2.01 x 10^-87

同样,如果您有一个字符串池并且您正在尝试确定与池发生冲突的概率,那么您在 birthday paradox 的域中,而我在这里计算的这个概率不适用.那和散列并不像他们应该的那样统一。实际上,您的碰撞率会高得多,但仍然很小。


编辑

由于您正在处理生日悖论的情况,请应用与解决生日悖论相同的逻辑。让我们从一个哈希函数的角度来看:

N := the number of hashes in your pool (several hundred million)
S := the size of your hash space (2^288)
Therefore,
P(There are no collisions) = (S!)/(S^N * (S - N)!)

假设我们有一个很好的偶数哈希值,比如 2^29(大约 5.3 亿)。

P = (2^288!)/(2^288^(2^29) * (2^288 - 2^29)!)

简而言之,我什至不想考虑计算这个数字。我什至不确定你如何去估计它。你至少需要一个任意精度的计算器,它可以处理巨大的阶乘而不会死。

请注意,概率将遵循一条曲线,当 N = 1 or 2 时从接近 0 开始,当 N >= 2^288 时它将达到 1,类似于 Wikipedia 页面上关于生日悖论的形状。

生日悖论在N = 23 时达到P = .5。换句话说,当 N 为 S 的 6% 时,碰撞的概率为 50%。如果按比例缩放(我不确定是否如此),这意味着当你有 50% 的机会发生碰撞时2^288 哈希的 6%。 2^288 的 6% 约为 2^284。你的 N 值(几亿)远不及那个值。与你的 S 相比,它实际上微不足道,所以我认为你没有什么可担心的。碰撞的可能性不大。

【讨论】:

还有一个假设:MD5 和 SHA1 中的冲突是独立的。也就是说,这两种算法的行为完全不同,以至于在 MD5 中发生冲突的一对字符串在 SHA1 中发生冲突的可能性并不比平时更大。我认为这是一个安全的假设,尽管这两种算法的设计相似。 只是为了扩展 Beta 的声明。 Welbog的分析应该作为一个理论上的下限,实际概率保证大于等于这个下限。找到实际的真实概率在密码学上是困难的,您实际上必须完全破解 MD5 和 SHA-1 才能证明实际概率。 re:最后一段:它不是线性缩放的。生日悖论 P=.5 大致为 sqrt(S),虽然我不以为然,但我找不到有信誉的参考资料说明这一点。 即使是sqrt(S),2^29与2^144相比仍然微不足道。但我接受它可能不是线性的。 http://www.wolframalpha.com/input/?i=2^(288!)/(2^(288^(2^29)) (2^288-2^29)!)【参考方案2】:

Welbog 帖子的附录:

可以使用Stirling's approximation:在不使用任意精度算术的情况下计算大阶乘的比率:

n! ≈ sqrt(2πn) * (n/e)n

所以 (S!)/(S^N * (S - N)!) ≈ sqrt(2πS)/sqrt(2π(SN))*(S/e)S/( (SN)/e)SN/SN

= sqrt(S/(S-N)) * (S/(S-N))S-N * e-N

= sqrt(1 + α) * (1 + α)S-N * e-N 其中α = N/(S-N) 很小。

近似值 (1+a/n)nx ≈ eax 成立为 n → ∞(或至少变得非常大)

** 所以这意味着 (1+(N/(S-N)))S-N ≈ eN for S-N >> N.

所以我期待

(S!)/(S^N * (S - N)!) ≈ sqrt(1 + N/(SN)) * eN * e-N sup> = sqrt(1 + N/(SN)) for SN >> N....

除了这大于 1...所以其中一个近似值不够好。 :p

(** 警告:N/S 必须很小:对于 N=22,S=365,这是 2 倍)

【讨论】:

darnit,当我打错字时,你们一直在投票给我!【参考方案3】:

如果消息大小不受限制,则机会渐近接近 100%,因为可能的消息数量是无限的,而可能的哈希值是有限的。

(注意:对问题进行编辑使这变得不那么相关了)

【讨论】:

没有。不管消息有多大,它仍然会散列为单个 MD5+SHA1 散列。 你没有抓住重点。可能的散列数量有限,因为它们的长度是有限的。有无限数量的消息。无限的消息加上有限的哈希意味着无限的冲突。 @fantius 问题已编辑。我什至在您发表评论前 19 分钟在此答案中注明了这一点。 ceejayoz,我认为出现这种混淆是因为您在说“消息数量”时说的是“消息大小”。 如果不限制消息大小,则消息数量因此不受限制,如“message”、“messagemessage”、“messagemessagemessage”等。无限的消息大小在逻辑上会导致无限数量的消息。【参考方案4】:

通常,当一个人随机选择 N 个元素时,计算预期碰撞次数比计算碰撞概率更容易。由于预期的碰撞次数不能小于碰撞概率,因此可以经常将其用作合适的上限。

假设 p 是两个随机选取的元素发生碰撞的概率。如果我们选择 N 个随机元素,则有 N*(N-1)/2 对元素,因此预期的碰撞次数为

p * N * (N-1)/2.

例如,如果我们假设 MD5 和 SHA1 发生冲突的概率是 p=2-288,那么即使在随机选取 2100 个元素之后,我们仍然只预计大约 2-89 次碰撞。

另一个例子:如果我们选择 230 个随机元素并且只计算 MD5。假设两个 MD5 哈希之间的冲突是 p=2-128,这给出了冲突次数的预期数字 2-59。因此,即使是两个输入的 MD5 哈希冲突的概率也已经非常小了。

【讨论】:

【参考方案5】:

选择的答案不正确,因为它使用了错误的概率。我今天花了很大一部分时间研究这个(你可以在 cmets 中看到我对该答案的思考过程),并相信实际答案如下(对于比你正在谈论的消息稍大的消息的生日攻击) :

2^-61 * 2^-18 = 2^79 内发生一次碰撞。

如果可以将这些概率相乘(我不确定)。

今天的超级计算机可以做到这一点(不到几个月,而且每年都在下降)。

请注意,这是基于足够大的消息池(使生日悖论有意义)。这也是你说你担心的场景。

现在,另一种情况是发现 特定 消息的一对哈希值(SHA1 和 MD5)的冲突。这使您摆脱了生日悖论的领域,并且难度增加了几个数量级。我不确定那是 2^(-61*2)*2^(-18*2) 还是其他东西。 如果有人知道那是什么,请对此答案发表评论(将不胜感激!)。

现在你问:

给定两个不同的消息,A 和 B(如果大小很重要,可能是 20-80 个字符的文本)

是的,大小确实很重要。单击指向 2^-18 图的链接,您将看到该值适用于两个输入块。在 MD5 中,一个输入块是 512 字节。 20-80字符的文字太小了,单块值是2^41。

因此,对于该数据量,您得到 2^-61(我认为)* 2^-41 = 2^-102。

所以对于那个大小,它是 seems safe(链接包含两倍当前比特币哈希率的 SHA256:46626.93 TH/sec)。

【讨论】:

以上是关于两条消息具有相同 MD5 摘要和相同 SHA1 摘要的可能性有多大?的主要内容,如果未能解决你的问题,请参考以下文章

SHA1、SHA2安全hash算法

MD5、sha1、sha256分别输出多少位?

1.2常用安全加密

第十五章 加密算法实例1--注册登录(消息摘要算法)

MD5,sha1,sha256分别输出多少位啊?

JWT认证方案与禁用令牌策略