我们有一个文件存储空间,存储空间根据附加到crc32的大小唯一标识文件。
我想知道这个校验和(crc32 + size)是否足以识别文件,还是应该考虑其他一些散列技术,如MD5 / SHA1?
答案 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(或者您可以负担得起)。