CRC32 对文件完整性检查真的那么糟糕吗?

Posted

技术标签:

【中文标题】CRC32 对文件完整性检查真的那么糟糕吗?【英文标题】:Is CRC32 really so bad for file integrity check? 【发布时间】:2012-05-09 10:54:44 【问题描述】:

当然,MD5 比 CRC32 好,SHA1 比 MD5 好等等......但它们也比 CRC32 慢得多。

知道了,我正在考虑如何检查被传输文件的一致性,CRC32是最快的选项。

我没有找到任何地方CRC32 的完整性检查有多糟糕(也许换句话说,CRC32 可能不会检测到格式错误的文件)?

【问题讨论】:

【参考方案1】:

引用http://www.mathpages.com/home/kmath458.htm:

所以,如果我们假设数据的任何损坏都会影响我们的字符串 以完全随机的方式,即损坏的字符串是 与原始字符串完全不相关,则概率 未检测到的损坏字符串的 1/(2^n)。这是基础 人们说 16 位 CRC 的概率为 1/(2^16) = 1.5E-5 未能检测到数据错误,32位CRC的概率为1/(2^32),约为 2.3E-10(不到十亿分之一)

我的观点:CRC-32 对于错误检测来说绰绰有余。它正在被广泛使用。但是,当您想将其用作“哈希函数”时,它并不安全。

【讨论】:

【参考方案2】:

使用 CRC-32 很容易发生冲突(相同的哈希输出但不同的数据),因为与其他算法相比,CRC-32 仅使用 32 位。 MD5是128位,SHA-1是160位,SHA-2(SHA256/512系列)是224位-512位。 (取决于你使用什么)。此外,对于 SHA-2 系列,没有发现冲突。

有关可能导致数据冲突的数学和概率的更多信息。请寻找Hash Collision和Birthday paradox problem

【讨论】:

以上是关于CRC32 对文件完整性检查真的那么糟糕吗?的主要内容,如果未能解决你的问题,请参考以下文章

Golang-常用校验算法

CRC8,CRC16,CRC32校验不可靠的概率有多高

CRC32(C) 可以返回 0 吗?

stm32串口接收完整的数据包

分析数据摘要算法的效率性能(SHAMD5和CRC32)

关于python实现CRC32Mpeg2的应用和总结