CRC32+大小与 MD5/SHA1

Posted

技术标签:

【中文标题】CRC32+大小与 MD5/SHA1【英文标题】:CRC32+Size vs MD5/SHA1 【发布时间】:2011-07-31 01:50:28 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

MD5 已被证明存在缺陷五年。不要使用它或至少将它与其他方法结合使用。 @STATUS_ACCESS_DENIED:+1 你是对的。我永远不会将 MD5 用于任何事情。无论如何,我认为@Rajiv 的意图与安全无关。因此,对于本地存储,即使是 MD5 也足够了【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

您没有指定语言,但例如在 C++ 中,您得到了 Boost CRC 为您提供所需大小的 CRC(或者您有能力存储)。

【讨论】:

语言实现是 C。我将研究 BoostCRC。谢谢

以上是关于CRC32+大小与 MD5/SHA1的主要内容,如果未能解决你的问题,请参考以下文章

为啥下载的有些WIN7系统会公布MD5,SHA1,CRC32?

MD5、SHA1、CRC32这三个用于检测文件是不是被修改过,哪个可靠性最高?

Python计算校验文件的MD5SHA1SHA256和CRC32

MD5、SHA1、CRC32值是干啥的?

MD5SHA1CRC32值是干什么的?

CRC和散列方法(MD5、SHA1)的区别