CRC32
CRC32(Cyclic Redundancy Check,循环冗余校验)是一种检测数据错误的校验算法,输出一个 32 位(4 字节)的校验值,常写成 8 位十六进制,如 414FA339。它广泛用于 ZIP 压缩包、PNG、gzip、以太网帧等场景,用来快速判断数据在传输或读写过程中是否被意外损坏。
原理是把整段数据看成一个二进制大数,用一个固定的"生成多项式"对它做模 2 除法,取余数作为校验码。要注意常见变体的多项式并不相同,因此结果不通用:
CRC-32/ISO-HDLC:ZIP、gzip、PNG 使用,多项式0x04C11DB7(反射式)。CRC-32C(Castagnoli):iSCSI、ext4 等使用,多项式不同,结果与前者不一致。
最大的误区是把它当作安全哈希。CRC32 是线性算法,既不防篡改也不抗碰撞——伪造一段数据凑出相同校验值非常容易,所以不能用于口令存储、数字签名或防篡改校验,那些场景应改用 SHA-256 等密码学哈希。它只保证"无意的错误大概率能被发现",仅此而已。
常见问题
CRC32 能用来存密码或做签名吗?
不能。CRC32 只是错误检测算法,不是密码学哈希,构造碰撞极其容易,攻击者能轻松伪造出相同校验值。涉及安全的场景请用 SHA-256、HMAC 等。
为什么同一份数据不同工具算出的 CRC32 不一样?
因为 CRC32 有多个变体,生成多项式、初始值、输入输出是否反射、最终异或值都可能不同。最常见的是 ZIP/gzip 使用的 CRC-32/ISO-HDLC,它和 CRC-32C 的结果就不同。核对时要确认双方用的是同一变体。
CRC32 和 MD5 有什么区别?
CRC32 只有 32 位,目的是快速发现传输或存储中的偶发错误,速度快但不安全;MD5 是 128 位哈希,设计上用于标识内容。校验完整性用 CRC32 就够,但防篡改需要更强的密码学哈希。