CRC32 +大小与MD5 / SHA1

时间:2011-04-06 18:18:39

标签: hash md5 storage crc32

我们有一个文件存储空间,存储空间根据附加到crc32的大小唯一标识文件。

我想知道这个校验和(crc32 + size)是否足以识别文件,还是应该考虑其他一些散列技术,如MD5 / SHA1?

4 个答案:

答案 0 :(得分:2)

CRC是一种错误检测方法,而不是严重的哈希函数。它有助于识别损坏的文件,而不是唯一地识别它们。 所以你的选择应该在MD5和SHA1之间。

如果您没有强大的安全需求,可以选择速度更快的MD5。 (请记住,MD5易受碰撞攻击)。 如果您需要更高的安全性,最好使用SHA1甚至SHA2。

答案 1 :(得分:2)

CRC-32不够好;构建冲突是微不足道的,即两个具有相同CRC-32的文件(如果你愿意的话,长度相同)。即使没有恶意攻击者,一旦你有大约65000个具有相同长度的不同文件,冲突就会随机发生。

哈希函数旨在避免冲突。使用MD5或SHA-1,您不会发生随机冲突。如果您的设置与安全相关(即某人,某个地方,可能会主动尝试创建冲突),那么您需要一个安全哈希函数。 MD5不再安全(与MD5的碰撞很容易)并且SHA-1在这方面有点弱(没有计算实际的碰撞,但是创建一个的方法是已知的,虽然价格昂贵,但它比成本低得多)它应该是)。通常的建议是使用SHA-256或SHA-512(SHA-256足以保证安全;在大型64位系统上SHA-512可能会更快一些,但文件读取带宽将比散列速度更加限制)

注意:使用加密哈希函数时,无需存储和比较文件长度;哈希足以消除文件的歧义。

在非安全设置中(即您只担心随机冲突),可以使用MD4。它作为加密哈希函数彻底“破解”,但它仍然是一个非常好的校验和,并且它非常快(在某些基于ARM的平台上,它甚至比CRC-32更快,因为它更好地抵抗随机碰撞)。基本上,您不应该使用MD5:如果您遇到安全问题,则不得使用MD5(它已损坏;使用SHA-256);如果你有安全问题,那么MD4比MD5更快。

答案 2 :(得分:0)

正如其他人所说,CRC并不保证没有碰撞。但是,只需通过增加64位数字的文件即可解决您的问题。这保证永远不会发生冲突(除非您想将大量文件保存在一个目录中,这无论如何都不是一个好主意)。

答案 3 :(得分:0)

CRC32 +尺寸使用的空间为更大的CRC提供了足够的空间,这将是一个更好的选择。如果您不担心恶意碰撞,那么托马斯的答案适用于哪种情况。

您没有指定语言,但是例如在C ++中,您Boost CRC为您提供了所需大小的CRC(或者您可以负担得起)。