昨天介绍了几款比较常用的文件校验软件,今天继续昨天的话题向大家介绍一下CRC32、MD5及SHA1算法校验知识,在想要写本文之前思齐对这些内容也是不太了解,所以特地在网络上找了一下这部分的资料,然后再整理整理放上来与大家共同分享学习下!
CRC32、MD5和SHA1是目前用来校验文件信息真实性的主要手段,使用这些校验算法可以发现保存或传输的信息是否受到损坏或篡改,防止文件或信息被恶意篡改。下面将分别介绍这几种校验算法。
1、CRC32
CRC全称为Cyclic Redundancy Check,又叫循环冗余校验。CRC是目前使用中最老的一种校验算法,它是由W. Wesley Peterson在1961年发表的论文中提出,CRC是种根据网络数据封包或电脑档案等数据产生简短固定位数校验码的一种散列函數(HASH,把任意长度的输入通过散列算法,最终变换成固定长度的摘要输出,其结果就是散列值,按照HASH算法,HASH具有单向性,不可逆性),主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。
尽管CRC在错误检测中非常有用,但CRC并不能可靠地校验数据完整性,这是因为CRC多项式是线性结构,可以非常容易地通过改变数据方式达到CRC碰撞,这里给一个更加通俗的解释,假设一串带有CRC校验的代码在传输中,如果连续出现差错,当出错次数达到一定次数时,那么几乎可以肯定会出现一次碰撞(值不对但CRC结果正确),但随着CRC数据位增加,碰撞几率会显著降低,比如CRC32比CRC16具有更可靠的验证性,CRC64又会比CRC32更可靠,当然这都是按照ITU规范标准条件下。
正因为CRC具有以上特点,对于网络上传输的文件类很少只使用CRC作为校验依据,文件传输相比通信底层传输风险更大,很容易受到人为干预影响。
2、MD5
MD5全称为Message-Digest Algorithm 5,又叫摘要算法和哈希算法。是Ronald L. Rivest在1992年间提出的,MD5由MD4、MD3、MD2改进而来,MD5散列长度通常是128位,是目前被大量广泛使用的散列算法之一,主要用于密码加密和文件校验等,虽然MD5比CRC的安全可靠性要高的多,但目前已经找到可行的破解方法。现在网上虽然出现有些破解网站和软件,不过可以肯定实际作用范围相当有限,比如,即使黑客拿到了PASSWORD MD5值,除了暴力破解,即使找到碰撞结果也未必能够影响用户安全问题,因为对于密码还要限定位数、类型等,但是如果是面向数字签名等应用,可能就会被破解掉。
3、SHA1
SHA全称为Secure Hash Algorithm,又叫安全散列算法。SHA是由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,SHA家族算法有SHA-1、SHA-224、SHA-256、SHA-384和SHA-512(后四者通常并称SHA2),原理和MD4、MD5相似。SHA可将一个最大2^64位(2305843009213693952字节)信息,转换成一串160位(20字节)的散列值(摘要信息),是目前应用最广的HASH算法。同MD5一样,从理论角度,SHA1也不是绝对可靠,目前也已经找到SHA1的碰撞条件,但“实用”的碰撞算法软件还没出现。于是美国NIST又开始使用SHA2,研究更新的加密算法。
补充:虽然目前这几种校验算法都找到了破解条件,但像目前主流使用的MD5、SHA1还是值得信赖的,因为MD5和SHA1都具有高度的离散性,哪怕是只修改一个字节值都会导致MD5或SHA1值“巨大”变化,从实践角度,不同信息具有相同MD5或SHA1码的可能性非常低,通常认为是不可能的,对于普通的下载文件或操作系统,想通过简单的修改某个字节或某些字节,又要保证文件名、大小和安装可靠性的前提下,想达到MD5、SHA1碰撞效果也几乎是不可能的。