CRC32 校验

计算 CRC32 校验值,数据校验常用

—

CRC32 是什么:它防的是意外损坏,不是恶意篡改

CRC32 的性质

CRC(循环冗余校验)把数据当作一个二进制多项式,除以一个固定的生成多项式,余数就是校验值。CRC32 输出 32 位(8 个十六进制字符)。

它的设计目标是以极低的计算成本发现传输和存储中的意外位错误。它可以保证检出所有单比特错误、所有长度不超过 32 位的连续突发错误(burst error),以及绝大多数更长的突发错误。这正是它出现在以太网帧、ZIP、PNG、gzip、以及几乎所有闪存和磁盘控制器里的原因——这些场景里的错误是随机的,不是有人故意造的。

为什么它不能用于安全

CRC32 是线性的:CRC(a ⊕ b) = CRC(a) ⊕ CRC(b)(在调整长度后)。这意味着攻击者可以直接计算出需要追加什么字节,让修改后的数据 CRC 保持不变——不需要穷举,一次算术运算就够。

再叠加输出只有 32 位,随机猜测的成功率是 1/2³²——看起来小,但对自动化攻击来说完全不构成障碍。

所以:CRC32 可以用来检测"文件下载有没有损坏",绝不能用来检测"文件有没有被人换过"。后者需要 SHA-256 或数字签名。

和相邻概念的区别

名称位数用途抗篡改
奇偶校验1 位只查单比特错误否
Adler-3232 位zlib 快速校验,比 CRC32 快但更弱否
CRC3232 位网络、压缩包、存储的完整性否
MD5128 位非对抗性校验、缓存键否(碰撞可行)
SHA-256256 位完整性、证书、签名是

变体与实现细节

CRC32 有几个参数会因场景不同而变化,这也是为什么两个 CRC32 实现可能算出不同的值:

如果算出的校验值和工具(或发布方)给的不一致,先确认这组参数,而不是怀疑数据坏了。本工具使用与 ZIP/PNG 相同的那一组(CRC-32/ISO-HDLC),同时输出十六进制与十进制形式。

常见问题

CRC32 能当哈希用吗?

不能。CRC32 是检错码,只用于发现传输/存储错误,不抗碰撞,没有安全属性。