编码与安全指南
CRC32 不一致:变体、字节与无符号显示
用已知测试向量区分 IEEE CRC32、CRC32C 以及带符号显示造成的差异。
写明变体名称
CRC32 是一类算法的名称,并非完整规格,CRC32C 与 Gzip 使用的 IEEE CRC32 多项式不同。
本站提供 IEEE 风格 CRC32 与 Adler32,没有 CRC32C 计算模式。
ASCII bytes of "123456789":
IEEE CRC32 → cbf43926
CRC32C → e3069283对齐输入字节
换行、UTF-8 BOM 或字符编码变化都会改变校验和,文件查看器显示的名称不是计算输入。
统一使用不带结尾换行的九个 ASCII 数字;文件协议还需确认规定的字节区间。
比较前统一显示方式
32 位结果可以显示为有符号十进制、无符号十进制或十六进制,负数显示也可能是同样比特。
先统一成八位 HEX 或无符号 32 位值,再判断不一致。
0xcbf43926 >>> 0 → 3421780262
0xcbf43926 | 0 → -873187034CRC 不能验证身份
CRC 能发现很多偶然变化,但不是针对攻击者主动篡改设计的。
解决兼容问题后,存在恶意修改风险时仍要采用协议的认证完整性机制,匹配 CRC 不能验证发送者身份。