CRC 与哈希的区别
CRC 与密码学哈希都会输出定长摘要,但目标完全不同。CRC 是线性校验码,用于发现传输或存储中的随机错误,设计目标是快速与易于硬件实现,攻击者可以轻易构造出校验值相同的不同内容;SHA-2、SHA-3 等密码学哈希则要求抗碰撞与抗前像,用于签名、证书指纹与 HMAC。
基本信息
| 典型算法 | CRC-32、CRC-16、Adler-32 与 SHA-256、SHA-3、BLAKE2 |
|---|---|
| 数学结构 | CRC 为线性反馈移位,哈希为非线性压缩 |
| 抗篡改 | CRC 不具备,哈希具备(在设计强度内) |
| 常见位置 | ZIP、PNG、以太网 FCS 用 CRC;签名与证书用哈希 |
| 输出长度 | CRC-32 为 32 位,SHA-256 为 256 位 |
典型使用场景
- 下载固件后校验:厂商同时给出 SHA-256 与 CRC 时应以哈希为准
- 文件格式内部校验:ZIP 与 PNG 用 CRC 检测存储损坏
- 链路层差错检测:以太网帧尾 FCS 使用 CRC-32
- 代码签名与证书指纹:必须使用 SHA-256 及以上哈希
- 接口签名:需要 HMAC 而非裸哈希,避免长度扩展与伪造
校验命令对照
校验命令对照
sha256sum firmware.bin # 密码学哈希,安全校验用
shasum -a 512 firmware.bin # SHA-512
cksum firmware.bin # POSIX 校验和(CRC 变体)
crc32 firmware.bin # 部分发行版提供
openssl dgst -sha256 firmware.bin # 与 sha256sum 等价维度对照
| 维度 | CRC32 / Adler-32 | 密码学哈希 |
|---|---|---|
| 目标 | 检测随机错误 | 抗篡改与抗碰撞 |
| 碰撞难度 | 可构造同校验值内容 | 就现有算力不可行 |
| 速度 | 很快,硬件实现简单 | 中等,有加速时也很快 |
| 典型用途 | ZIP、以太网 FCS | 签名、HMAC、证书指纹 |
安全相关场景不要用 CRC32 校验:攻击者可以构造出校验值相同的伪造内容,下载站点若只提供 CRC 校验值,等于没有防篡改能力。
哈希能发现篡改但不能证明来源,任何人都能对伪造内容重算哈希;防伪造需要签名或 HMAC,密钥不参与时哈希只是一致性检查。
选择判据
- 需要防篡改与防伪造:用 SHA-256 及以上哈希或 HMAC,不用 CRC
- 只需发现传输误码:CRC 足够且实现成本更低
- 需要高速软件校验:CRC-32C 有成熟的快速实现
- 需要与硬件协处理器配合:CRC 有现成的硬件支持
「校验和」一词常被混用:TCP 首部校验和、IP 首部校验和与 CRC 一样只防随机错误,不防主动篡改;把这类字段当作安全机制是常见误解。