校验和
校验和(checksum,也叫校验值)是按固定算法从一段数据算出的一个较短的值,用来检测数据在传输或存储过程中是否被意外改动。发送方算出校验和随数据一起发出,接收方用同样的算法重新计算,两个值一致就大概率没出错,不一致则说明数据损坏。它的核心目标是发现"错误",而不是防"篡改"。
常见实现从简单到复杂:
- 按字节累加求和、异或——最简单,但漏检率高;
CRC32——循环冗余校验,广泛用于zip、以太网帧、PNG 等,擅长发现连续的比特翻转;MD5/SHA-256——严格来说是哈希,但常被当作"文件校验和"来核对下载完整性。
使用要点与误区:校验和只在防意外损坏时可靠,不等于安全。CRC32 和简单求和都能被轻易伪造,攻击者可以一边改数据一边凑出相同的校验和;MD5 也已被攻破,不宜用于防篡改。若要抵御恶意篡改,应使用带密钥的 HMAC 或数字签名,而非普通校验和。此外,校验和相同只是"极大概率"相同,不同数据理论上仍可能碰撞出同一个值。
常见问题
校验和和哈希是一回事吗?
校验和一致就能证明文件没被人篡改吗?
不能。普通校验和(如 CRC32、MD5)都可能被伪造或碰撞,只适合发现意外损坏。要防恶意篡改,需要用 HMAC 或数字签名。
下载软件时核对 MD5/SHA256 有意义吗?
有,能确认下载过程没出错、文件没被截断或损坏。但如果下载源本身被入侵、页面上的校验值也被一并替换,就防不住,所以应优先信任来自可信渠道的 SHA-256 值。