两个不同的固件文件可以有相同的 md5 总和吗?

min*_*nto 10 firmware md5sum checksums

两个不同的二进制文件可以有相同的 md5 总和吗?一个二进制固件文件具有不同的版本号并标记为已修订,修复了小错误。但是两个文件都有相同的 md5 总和,我认为修改后的文件不能有相同的 md5 总和 - 这会是一个错误吗?

mur*_*uru 18

当然。MD5 的碰撞漏洞是众所周知的(参见Crypto.SE , Wikipedia)。虽然它仍然是一个低概率事件,但它可以做到。但是,在您的情况下,我怀疑复制文件时出错。

  • _“我怀疑复制文件时有错误”_ - 这种意外发生的可能性基本上是 0。如果两个文件具有相同的 md5,则它们要么是同一个文件,要么被故意(恶意)更改为具有与另一个相同的 MD5。 (2认同)

Lig*_*bit 16

现有答案未能指出的是,为什么在这种情况下碰撞被认为几乎不可能发生。

MD5 与任何散列算法一样,经过精心设计,因此如果您只更改少量字符,就不会发生冲突。您必须更改大部分(如果不是全部)才能循环回相同的哈希值。那是因为散列的全部意义在于检测一位(或几位)错误;在这个问题域中,您希望较小的更改肯定会触发哈希更改。虽然我们现在知道 MD5 是有缺陷的,但该属性一直保留到今天。

所以,除非固件的新版本是完全不同的而且除非你只是目睹了一次在一百万的现象,赔率是巨大的,你只需再次收到的旧版本。恭喜,因为这是哈希检查过程完全按预期工作。:)

  • “百万分之一”是一个令人难以置信的轻描淡写。2^128 大约是 10^38.5,所以它更接近十亿分之一,这种事件发生的可能性很小,因此在我们太阳系的(预计)生命周期内不值得考虑它。 (2认同)
  • 我知道这一点,但我想强调的是,事实上,这种可能性比众所周知的百万分之一低 32 个数量级,这对于说明这种情况很重要。 (2认同)

hee*_*ayl 11

通常,md5只有当两个文件的内容完全相同时,它们才能具有相同的哈希值。即使是一点点变化也会产生完全不同的哈希值。

有一点需要注意,虽然:一个md5总和为128位(16个字节)。由于不同的可能文件内容的数量是无限的,而不同的可能的 md5 和的数量是有限的,因此存在散列冲突的可能性(尽管在大多数情况下概率很小)。换句话说,当使用 md5 散列时,两个不同的文件可以产生相同的总和。

因此,在某些情况下最好使用更高位的哈希(更多可能的不同输出),以降低(已经很低)偶然哈希冲突的概率,并增加通过蛮力创建故意哈希冲突的难度。

较高位散列的示例包括 SHA-2 散列系列,尤其是sha256sha384、 或sha512(这是最好的)。后面sha的数字表示相应散列算法生成的位数。

  • “只有当它们的内容完全相同时,两个文件才能具有相同的‘md5’哈希值,即使是一点点变化也会产生完全不同的哈希值。” ——这是错误的。由于鸽巢原理,实际上有无数个文件具有相同的哈希值。 (10认同)
  • @JörgWMittag 在 :) 之后检查警告段落 (2认同)
  • 对于二进制(非文本)文件,使用 `cmp` 而不是 `diff`。 (2认同)