我知道MD5哈希值不再适用于安全性,但我一直使用它们作为校验和来确保文件在下载/传输后没有被破坏,我认为这仍然没问题。虽然在大于千兆字节的文件上使用此方法后,我发现存储和生成的哈希值不匹配。这是在我通过USB记忆棒将其从一台计算机传输到另一台计算机之后。我在网上搜索过,发现一些对大文件的引用可能会产生不一致的哈希值,但我没有看到任何结论。
我使用ComputeHash(Stream inputStream)
MD5CryptoServiceProvider
来创建传输之前和之后的哈希值,因此不应该是字节格式在不同语言之间混淆的情况。我也尝试再次从文件中构建哈希,第二次它似乎创建匹配哈希很好。我是不是很不走运,实际上在将文件复制到USB记忆棒上之后最终破坏了文件?或者这是MD5的一个已知问题,我应该完全抛弃它?如果是这样,那么理想情况下也是C#标准配置的最佳替代品,SHA1是下一个最佳选择吗?
答案 0 :(得分:5)
不,MD5没有用于此目的。 哈希值始终相同。文件中必须有一些区别。您可以使用二进制差异工具,就像在某些十六进制编辑器中找到的那样,来验证自己有什么不同。
您可以使用其他MD5工具(例如md5sum
或HashTab)验证您的计算是否正确。
不推荐使用MD5的原因不是它不起作用,或类似的东西。这是因为冲突的概率(为两个不同的输入生成相同的哈希值)足够高,以至于攻击者可以故意生成冲突以绕过安全功能。
这正是用于欺骗Microsoft签名的Flame malware did。
答案 1 :(得分:4)
某些数据的MD5哈希值与完全相同数据的第二个MD5哈希值完全相同,无论该数据的大小如何。对于大型文件,MD5的唯一问题是,在某些情况下,您可能会获得两个不同文件的相同哈希值。但这很不可能。
同样的事情将适用于SHA1和任何其他哈希算法,因为您将大数据空间转换为一个小的哈希空间。
在USB总线或闪存设备本身传输过程中发生损坏的可能性更大。