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

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

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

与任何哈希算法一样,MD5是经过精心设计的,因此如果您只更换少数几个字符,就不会发生碰撞。 您必须更改大部分(如果不是全部)以便循环回到相同的哈希。 那是因为散列的重点是检测单比特(或几比特)错误; 在此问题域中,您希望较小的更改肯定会触发哈希更改。 虽然我们现在知道MD5是有缺陷的,但这个属性至今仍然存在。

因此,除非新版本的固件完全不同 ,除非您只是目睹了一个百万分之一的现象,否则您只是再次收到旧版本的可能性很大。 恭喜,因为这是完全按照预期工作的散列检查过程。 🙂

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

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

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

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

高位哈希的示例包括SHA-2哈希族,特别是sha256sha384sha512 (这是最好的。) sha之后的数字表示相应的哈希算法生成的位数。

正如其他人所说,MD5碰撞是假设可能的,但非常难以置信(1 ^ 2 ^ 128只有340,282,366,920,938,463,463,374,607,431,768,211,456中的1),并且您很可能有文件复制错误。

我建议使用这里描述的众多方法之一对这两个文件进行逐字节比较: https : //superuser.com/questions/125376/how-do-i-compare-binary-files- in-linux 。

或者只是diff file1 file2 – 除非你收到消息“二进制文件file1和file2不同”,否则文件是相同的。

以上所有答案都忽略了最重要的细节:

MD5校验和定义为128位。 这意味着,只有2 ^ 128个不同的MD5值。 可以使用多少种不同的固件映像? 那么,这取决于它们有多大,这取决于随机字节序列的百分比可被视为有效固件。 但可能有超过2 ^ 128个可能的固件映像。

更多,这意味着必须有重复。

但是,任何给定固件映像匹配给定 MD5校验和的机会仅为2 ^ 128中的1,这是一个非常小的数字。

非常小。

比如,任何两个开发人员在人类文明存在的过程中随时意外创建具有相同MD5校验和的不同图像的可能性太小,您无需担心。

那是偶然的故意是一个不同的问题。 如果您正在为NSA工作,那么128位不足以满足您的老板的安全性,并且MD5已知的漏洞使其弱于128位。

但如果你在为国家安全局工作,那么你可能已经知道了。

非常不可能,但可能。 检查文件大小和日期以获取更多信息。 如果文件不同,那么它们更不可能具有相同的大小和散列。