CRC32算法概述CRC全称Cyclic Redundancy Check,又叫循环冗余校验。CRC32跟md5,sha1一样都是哈希算法的一种。crc32的优势是速度快,它被设计的目的是用来检测数据在网络传输过程中可能出现的随机错误。它跟md5和sha1有本质的区别就是它不是一种加密hash算法或者叫not cryptographically secure或者not cryptographic hashing。加密哈希算法的特征比如空间极大,碰撞概率极低,对于给定的哈希值难以找到另一个哈希值相同的字符串等crc32都不具备。 CRC32算法原理前面说到crc32的一些特性,这个要从crc32的原理开始分析。crc32的数学原理看起来还是有点复杂的,我也理解不透彻。简单一点理解就是把需要进行校验的数据选定一个除数进行一次除法运算,称为模2除法,跟通常二进制除法规则不同,得到的余数作为循环冗余码。数据接收端接收到数据之后进行同样的运算,即可判断数据在传输过程中是否出现了变化。当然具体的计算方式会复杂的多。这里说的不当的地方或者有更好的表达方式欢迎讨论。 CRC32算法碰撞和破解crc32碰撞的概率非常高,根据一些测试结果CRC32算法冲突概率测试和分析,对于随机数据的碰撞概率测试1820W数据,冲突数量是38638个。根据crc32的算法可以直接逆向找到相同crc32的字符串。脚本地址
对于给定的字符串进行padding暴力破解在短时间内是一定可以获得相同crc32结果的。测试脚本:crc-collision import binascii print binascii.crc32('{"auth_url": "https://www.evil.example"}' + ' '*2303357834) print binascii.crc32('{"auth_url": "https://www.google.com"}')
CRC32算法的使用场景CRC32的设计初衷是用来检测底层网络传输数据时由于网络问题导致的数据出错。所以多用在底层网络设备中。应用层也有一些使用场景。但是不能用来做加密hash即sha256函数做的事情,比如用来做签名。crc32是无法保证数据完整性的。它只能用来检测异常不能用来对抗恶意的行为。最近在对一个认证系统做审计的时候发现使用了crc32做数据签名。所以有了对crc32碰撞的测试。 (责任编辑:好模板) |