6

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

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

4

4 回答 4

3

CRC is most an error detection method than a serious hash function. It helps in identify corrupting files rather than uniquely identify them. So your choice should be between MD5 and SHA1.

If you don't have strong security needings you can choose MD5 that should be faster. (remember that MD5 is vulnerable to collision attacks). If you need more security you better use SHA1 or even SHA2 .

于 2011-04-06T18:26:25.057 回答
3

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

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

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

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

于 2011-04-07T13:24:50.937 回答
1

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

于 2011-04-06T19:13:25.377 回答
1

CRC32+size 将使用的空间为您提供了足够的空间来容纳更大的 CRC,这将是一个更好的选择。如果您不担心恶意碰撞,那么在这种情况下,Thomas 的回答就适用了。

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

于 2011-04-13T18:21:43.380 回答