13

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

我需要考虑以下几点:

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

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

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

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

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

自然,性能也值得关注。

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

4

1 回答 1

18

任何加密散列函数,即使是损坏的散列函数,都可以用于检测意外损坏。一个给定的散列函数可以只为输入定义到某个限制,但对于所有标准散列函数,该限制至少为 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 使用秘密的“对称”密钥,如果您希望某些人能够验证文件完整性而不能够执行静默更改,那么这是不合适的;在这种情况下,您将不得不求助于数字签名。简而言之,在安全环境中,您需要使用明确定义的攻击模型进行彻底的安全分析。

于 2010-10-26T16:01:29.003 回答