【问题标题】:What is the probability that the first 4 bytes of MD5 hash computed from file contents will collide?从文件内容计算的 MD5 哈希的前 4 个字节发生冲突的概率是多少?
【发布时间】:2009-11-13 20:19:59
【问题描述】:

这是一道组合数学题,需要一些散列算法理论。

假设输入可以是 30 kB 到 5 MB 大小的任意随机字节序列(我猜这会产生相当多的输入值组合 :))

从字节序列计算的 MD5 哈希的前 4 个字节(或前 n 个字节)对于不同的文件相同的概率是多少?

如果这不能专门针对 MD5 哈希计算,那么任何生成均匀分布的 m 字节哈希的哈希函数在给定输入范围的前 n 个字节上计算冲突哈希的概率是多少?

【问题讨论】:

  • 澄清:请不要评论MD5的安全性。我要解决的问题是如何检测相同的文件,而不是安全相关的。
  • 最近实施的 ZFS 重复数据消除带来了一些有趣的见解;哈希冲突确实在那里引发了一次有趣的攻击。如果您可以知道您刚刚创建的文件与另一个文件相同,那么您实际上破坏了文件系统 安全性。事实上,文件系统 insecurity 是 SHA256 security 的直接后果 - 如果你有相同的 SHA256 哈希,你几乎知道你有相同的文件。
  • 你能澄清一下你对字节的含义吗?当哈希以“E8:F0:D3:03:...”开头时,前四个字节是“E 8 F 0”还是“E8 F0 D3 03”?
  • 我很惊讶这里没有一个 cmets 提到文件头问题。如果您使用 Excel、Word、AutoCAD、JPG 等常见类型,他们知道文件头可能会大大增加冲突率。

标签: hash cryptography md5 combinatorics


【解决方案1】:

如果没有关于字节值概率的更多信息,我会认为它是 2^32 中的 1。

编辑。实际上,如果您使用十六进制字符而不是纯字节,则为 2^16 中的 1。

编辑基于评论:

MD5可以认为是统一的吗 计算值是 绝对随机?

MD5 散列算法的设计是为了输入的微小变化会导致完全不同的散列,所以我会说 MD5 散列字节以相等的概率分布(无论如何我不会赌任何东西)。无论如何,您可以对哈希应用后处理(例如,您可以使用 keyed MD5)以增加其随机性(顺便说一下,使其更安全,因为 plain MD5 hashes have been proved to be insecure)。

【讨论】:

  • ??将表示形式从字节更改为十六进制字符会更改概率。不计算。
  • 嗯,它取决于“前 4 个字节”,即第一个真正的 4 个字节或哈希的十六进制表示的前 4 个数字。
  • 感谢您的澄清。您的答案(以及其他说 1/65536 是概率)是否考虑了生日悖论?
  • @Marek:生日悖论适用于系列,而不是成对。这里给出的机会对于一对文件是正确的。因为我们不知道总共有多少个文件,所以总的机会是未知的。
【解决方案2】:

对于理想的散列函数,输出是均匀分布的,因此两个碰撞的机会是 2^32 分之一。然而,生日悖论告诉我们,如果我们正在比较所有散列对,我们应该期望在平均有 2^16 个散列时看到冲突 - 所以不要仅依赖 4 个字节“我的价值远低于 40 亿”。

正如我们所知,MD5 并不是一个理想的散列函数,但这里的弱点有些偶然:发现 4 个字节的冲突完全属于合理的蛮力攻击范围,因此无需诉诸于密码学的弱点。如果您只关心随机选取的数据,您不会看到与随机性有显着的统计偏差。

【讨论】:

    【解决方案3】:

    如果您对具有相同 4 字节哈希的两个特定输入的几率感兴趣,那么它只是 1/2^32。如果您对一组 X 总输入中具有相同几率的两个输入的几率感兴趣,那么在您开始接近集合中的 2^16 = 65536 个不同输入之前,该几率会保持相当低,达到接近 50%(这种现象被称为生日悖论)。

    一般来说,散列函数在密码学上有用的标准之一是所有位的一致性。

    【讨论】:

      【解决方案4】:

      由于birthday paradox,在 n 位散列中发生冲突的几率约为 2^(n/2) 分之一 - 因此在这种情况下约为 2^16 分之一。如果出于某种原因您指的是使用 32 位的十六进制编码,当然这只是前 16 个实际位,那么发生冲突的几率约为 2 ^ 8 分之一。

      给定一个特定的固定文件,随机选择的任何其他文件与该文件具有相同哈希值的几率约为 2^n。就加密哈希而言,它们之间的区别是第一个是冲突,另一个是原像。

      在这种散列大小下,MD5 的弱点几乎无关紧要,因为对 MD5 的最著名攻击大约需要 2^32 次计算,而即使是理想安全的 32 位散列,也可能在大约 2^16 次计算中产生冲突(由于仅选择随机输入,您就有 2^16 分之一的碰撞机会,因此在大约 2^16 次随机猜测之后,您可能会找到一对碰撞的输入)。

      【讨论】:

      • +1。很好的答案,发现 a 冲突(生日悖论复杂性)和 另一个文件 散列到相同摘要(第二个原像)之间的区别很重要。
      【解决方案5】:

      MD5 哈希通常是十六进制,因此每个字节有 16 个可能的值。因此对于四个字节,有 16*16*16*16 = 65536 种可能的组合,使得哈希冲突的概率为 1:65536。

      【讨论】:

      • 它们以十六进制显示给人类,但计算为 4 个 DWORD,因此他指的是第一个 DWORD。这是 4 个字节 == 2^32
      • 感谢您的快速回答。但是,这是否考虑了 MD5 的特定属性? MD5 是否可以认为计算值是绝对随机的?与绝对均匀的理想散列函数相比,MD5 的冲突概率不是更大吗?
      • 假设输入是“绝对随机的”,假设输出也是“绝对随机的”是合理的。哈希函数被设计为统一的,因此在实践中假设统一是安全的,除非输入经过专门设计以导致与给定的哈希函数发生冲突。
      【解决方案6】:

      md5 是十六进制的,所以每个字符可以是 16 个等位基因中的任何一个。 所以这将使16^n

      对于 4 个字符,有 65536 种不同的可能组合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 2021-06-19
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        相关资源
        最近更新 更多