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-32 | 32 位 | zlib 快速校验,比 CRC32 快但更弱 | 否 |
| CRC32 | 32 位 | 网络、压缩包、存储的完整性 | 否 |
| MD5 | 128 位 | 非对抗性校验、缓存键 | 否(碰撞可行) |
| SHA-256 | 256 位 | 完整性、证书、签名 | 是 |
变体与实现细节
CRC32 有几个参数会因场景不同而变化,这也是为什么两个 CRC32 实现可能算出不同的值:
- 生成多项式:最常见的是
0xEDB88320(反射形式,对应 0x04C11DB7),即 CRC-32/ISO-HDLC,ZIP 与 PNG 用它;而 CRC-32/BZIP2 用另一组参数。 - 初始值:常见为
0xFFFFFFFF。 - 输入/输出反射:是否反转每个字节的位序。
- 最终异或值:常见为
0xFFFFFFFF。
如果算出的校验值和工具(或发布方)给的不一致,先确认这组参数,而不是怀疑数据坏了。本工具使用与 ZIP/PNG 相同的那一组(CRC-32/ISO-HDLC),同时输出十六进制与十进制形式。
常见问题
CRC32 能当哈希用吗?
不能。CRC32 是检错码,只用于发现传输/存储错误,不抗碰撞,没有安全属性。