一个合适的散列函数来检测数据损坏/检查数据完整性?

时间:2010-10-26 08:45:34

标签: file hash checksum corruption data-integrity

用于检测损坏的文件完整性检查(校验和)最合适的哈希函数是什么?

我需要考虑以下事项:

文件大小范围广(1 kb到10GB +)
许多不同的文件类型
大量文件(+/- 100 TB并且不断增长)

较大的文件是否需要更高的摘要大小(SHA-1与SHA 512)?

我看到SHA系列被称为加密哈希函数。它们是否不适合“通用”用途,例如检测文件损坏?像MD5或Tiger这样的东西会更好吗?

如果恶意篡改也是一个问题,你的答案是否会改变w.r.t最合适的哈希函数?

外部库不是一个选项,只能在Win XP SP3 +上使用。

自然表现也值得关注。

(请原谅我的术语,如果不正确,我对此主题的了解非常有限。)

1 个答案:

答案 0 :(得分:16)

任何加密哈希函数,即使是破坏的函数,都可以用于检测意外损坏。给定的散列函数可以仅针对某些限制的输入来定义,但是对于所有标准散列函数,该限制是至少2个 64 位,即大约2百万兆兆字节。那太大了。

文件类型没有任何意义。散列函数在位(或字节)序列上运行,无论这些位代表什么。

哈希函数性能不太可能成为问题。即使是“慢”散列函数(例如SHA-256)在典型的PC上运行速度也比硬盘快:读取文件将成为瓶颈,而不是散列(2.4 GHz PC可以使用SHA-512以速度散列数据)接近200 MB / s,使用单核)。如果散列函数性能是一个问题,那么你的CPU非常虚弱,或者你的磁盘是快速SSD(如果你有100 TB的快速SSD,那么我有点嫉妒)。在这种情况下,一些散列函数比其他函数快一些,MD5是“快速”函数之一(但MD4更快,并且它的代码可以包含在任何应用程序中而不会有太多麻烦)

如果恶意篡改是一个问题,那么这就成了一个安全问题,那就更复杂了。首先,您将使用加密完整的哈希函数之一,因此SHA-256或SHA-512,而不是MD4,MD5或SHA-1(MD4,MD5和SHA-1中的弱点可能不适用于特定的情况,但这是一个微妙的问题,最好是安全地玩)。然后,根据攻击者是否可以访问哈希结果,散列可能或可能不足。可能,您可能需要使用MAC,这可以被视为一种键控哈希。 HMAC是从散列函数构建MAC的标准方法。还有其他非基于哈希的MAC。此外,MAC使用秘密的“对称”密钥,如果您希望某些人能够在不能执行静默更改的情况下验证文件完整性,则这是不合适的。在这种情况下,您将不得不求助于数字签名。简而言之,在安全环境中,您需要使用明确定义的攻击模型进行全面的安全性分析。