![两个不同的固件文件可以具有相同的 md5 值吗?](https://linux22.com/image/1057969/%E4%B8%A4%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84%E5%9B%BA%E4%BB%B6%E6%96%87%E4%BB%B6%E5%8F%AF%E4%BB%A5%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E7%9A%84%20md5%20%E5%80%BC%E5%90%97%EF%BC%9F.png)
两个不同的二进制文件可以有相同的 md5 和吗?一个二进制固件文件有不同的版本号,并标记为已修订,小错误已修复。但两个文件都有相同的 md5 和,我认为修订的文件不能有相同的 md5 和 - 这可能是一个错误吗?
答案1
答案2
现有答案未能指出的是为什么在这种情况下,发生碰撞的可能性极小。
MD5 和任何哈希算法一样,都是经过精心设计的,因此即使您只更改了几个字符也不会发生冲突。您必须更改大部分(如果不是全部)字符才能循环回到相同的哈希值。这是因为哈希值的全部目的是检测单比特(或几比特)错误;在这个问题领域中,您希望较小的更改肯定会触发哈希值更改。尽管我们现在知道 MD5 存在缺陷,但该属性至今仍然有效。
因此,除非新版本的固件完全不同,和除非您刚刚目睹了万中无一的现象,否则您再次收到旧版本的可能性很大。恭喜,因为这是哈希校验过程,正如预期的那样工作。:)
答案3
md5
一般来说,只有当两个文件的内容完全相同时,它们的哈希值才会相同。即使只有一点点差异,也会生成完全不同的哈希值。
但有一个警告:和md5
为 128 位(16 字节)。由于可能的文件内容数量是无限的,而可能的不同 md5 和的数量是有限的,因此哈希值有可能发生冲突(尽管在大多数情况下可能性很小)。换句话说,两个不同的文件能使用 md5 进行散列时产生相同的总和。
因此,在某些情况下最好使用更高位的哈希(更多可能的不同输出),以降低意外哈希碰撞的概率(已经很低),并增加通过暴力破解创建故意哈希碰撞的难度。
更高位哈希的示例包括 SHA-2 系列哈希,尤其是sha256
、sha384
或sha512
(最好)。后面的数字sha
表示相应哈希算法生成的位数。
答案4
所有上述答案都忽略了最重要的细节:
MD5 校验和定义为 128 位。这意味着,只有 2^128 个不同的 MD5 值。有多少不同的固件映像可能存在?这取决于它们的大小,也取决于有多少百分比的随机字节序列可以被视为有效固件。不过,很有可能有超过 2^128 个可能的固件映像。
A很多更多,这意味着必须是重复的。
但任何给定固件映像匹配给定MD5 校验和仅为 2^128 分之 1,这是一个非常小的数字。
非常小的。
就像任何两个开发人员的机会偶然在人类文明存在的任何时候创建具有相同 MD5 校验和的不同图像的可能性太小,您无需担心。
那是偶然。 故意地是另一个问题。如果你为 NSA 工作,那么 128 位的安全位不足以让你的老板满意,而且 MD5 存在已知漏洞,使其比 128 位更弱。
但如果你在美国国家安全局工作,那么你可能已经知道这一点了。