3

我知道 MD5 哈希不再可用于安全性,但我一直将它们用作校验和,以确保下载/传输后文件没有损坏,我认为这仍然可以。尽管在对大于千兆字节的文件使用此方法后,我发现存储和生成的哈希值不匹配。这是在我通过 USB 记忆棒将其从一台计算机传输到另一台计算机之后。我在网上搜索过,发现一些对大文件的引用可能会产生不一致的哈希值,但我没有看到任何结论。

我使用ComputeHash(Stream inputStream)MD5CryptoServiceProvider在传输之前和之后创建哈希,因此不应该是字节格式在不同语言或其他东西之间混乱的情况。我还尝试再次从文件中构建哈希,第二次它似乎可以很好地创建匹配的哈希。我是不是很不走运,实际上在将文件复制到 U 盘上和从 U 盘上复制下来之后最终损坏了文件?或者这是 MD5 的一个已知问题,我应该完全放弃它?如果是这样,理想情况下也可以作为 C# 标准提供的最佳替代品是什么,SHA1 是下一个最佳选择吗?

4

2 回答 2

5

不,为此目的,MD5 没有任何问题。哈希值总是相同的。文件中必须有一些差异。您可以使用二进制差异工具,例如在某些十六进制编辑器中找到的工具,以自己验证是否有所不同。

md5sum您可以使用另一个 MD5 工具(例如HashTab 来验证您的计算是否正确。


不再推荐 MD5 的原因不是它不起作用,或者类似的东西。这是因为冲突的概率(为两个不同的输入生成相同的哈希)足够高,以至于攻击者可以故意生成冲突以绕过安全功能。

这正是Flame 恶意软件用来欺骗 Microsoft 签名的方法。

于 2012-07-03T13:24:52.410 回答
4

某些数据的 MD5 散列将与完全相同数据的第二个 MD5 散列完全相同,无论该数据的大小如何。对大文件使用 MD5 的唯一问题是,在某些情况下,您可能会为两个不同的文件获得相同的哈希值。不过,这不太可能。

不过,同样的事情也适用于 SHA1 和任何其他散列算法,因为您将大数据空间转换为小散列空间。

在传输过程中,无论是在 USB 总线上还是在闪存设备本身上,这听起来更有可能发生损坏。

于 2012-07-03T13:26:40.160 回答