在某些网站下载软件的时候,官方会提供该软件的MD5值、SHA1值或CRC32值,目的我们都知道,就是防止文件被篡改,准确地说,不叫防止,就是你下载回去的软件或程序通过Hash校验工具计算后,如果Hash值对不上,就说明你的文件并不是官方提供的原版,哪怕只是一点点的修改,Hash值都会完全不一样。现在网上最流行的文件校验方式是计算机MD5和SHA1,微软发布Windows操作系统或其它软件,现在都采用CRC32结合SHA1的方式,几乎百分之一百不会发生碰撞,就是值不会一样,这样讲够清楚吗?
其实本文是想在小站上放一个Hash校验工具的,因为很常用,尤其是下载一些Windows系统或Office镜像的时候,下载回来后一定要进行对比校验。但是趁此机会,刚好可以来了解一下什么是MD5、SHA1和CRC32。这三种算法中属CRC最年长,也是应用最广泛,如果不考虑碰撞的条件下,这些算法都可以发现传输或保存的信息受到的损坏或篡改,比如文件校验可以防止文件被恶意篡改,数字签名可以保护合法者不被仿冒,系统鉴权一方面要保护用户存储信息不受侵害,还需要保护信息传输过程不受干扰破坏等等,具体看下面。以下均为转载。
1、MD5
MD全称Message Digest,又称信息摘要算法,MD5从MD2/3/4演化而来,MD5散列长度通常是128位, 也是目前被大量广泛使用的散列算法之一,主要用于密码加密和文件校验等。MD5的算法虽然非常“牢靠”,不过也已经被找到碰撞的方法,网上虽然出现有些碰撞软件,天缘没用过,但可以肯定,实际作用范围相当有限,比如,及时黑客拿到了PASSWORD MD5值,除了暴力破解,即使找到碰撞结果也未必能够影响用户安全问题,因为对于密码还要限定位数、类型等,但是如果是面向数字签名等应用,可能就会被破解掉,不过,MD5同下文的SHA1仍是目前应用最广泛的HASH算法,他们都是在MD4基础上改进设计的。
2、SHA1
SHA全称Secure Hash Standard,又称安全哈希标准,SHA家族算法有SHA-1、SHA-224、SHA-256、SHA-384和SHA-512(后四者通常并称SHA2),原理和MD4、MD5原理相似,SHA是由美国国家安全局(NSA)所设计,由美国国家标准与技术研究院(NIST)发布。SHA可将一个最大2^64位(2305843009213693952字节)信息,转换成一串160位(20字节)的散列值(摘要信息),目前也是应用最广泛的HASH算法。同MD5一样,从理论角度,SHA1也不是绝对可靠,目前也已经找到SHA1的碰撞条件,但“实用”的碰撞算法软件还没出现。于是美国NIST又开始使用SHA2,研究更新的加密算法。
3、CRC校验
CRC全称Cyclic Redundancy Check,又叫循环冗余校验。它是一种散列函数(HASH,把任意长度的输入通过散列算法,最终变换成固定长度的摘要输出,其结果就是散列值,按照HASH算法,HASH具有单向性,不可逆性),用来检测或校验传输或保存的数据错误,在通信领域广泛地用于实现差错控制,比如通信系统多使用CRC12和CRC16,XMODEM使用CRC16等等(12、16、32等值均是指多项式的最高阶N次幂),天缘早前在做通信方面工作时也是最常用到这个校验方法,因为其编解码方法都非常简单,运算时间也很短。
但从理论角度,CRC不能完全可靠的验证数据完整性,因为CRC多项式是线性结构,很容易通过改变数据方式达到CRC碰撞,天缘这里给一个更加通俗的解释,假设一串带有CRC校验的代码在传输中,如果连续出现差错,当出错次数达到一定次数时,那么几乎可以肯定会出现一次碰撞(值不对但CRC结果正确),但随着CRC数据位增加,碰撞几率会显著降低,比如CRC32比CRC16具有更可靠的验证性,CRC64又会比CRC32更可靠,当然这都是按照ITU规范标准条件下。
正因为CRC具有以上特点,对于网络上传输的文件类很少只使用CRC作为校验依据,文件传输相比通信底层传输风险更大,很容易受到人为干预影响。
补充说明
1、上文“碰撞”的解释,碰撞就是不同明文通过HASH后的结果相同。机率极小,但可能性还是存在。
2、MD5和SHA1都具有高度的离散性,哪怕是只修改一个字节值都会导致MD5或SHA1值“巨大”变化,从实践角度,不同信息具有相同MD5或SHA1码 的可能性非常低,通常认为是不可能的。
3、对于普通的下载文件或操作系统,想通过简单的修改某个字节或某些字节,又要保证文件名、大小和安装可靠性的前提下,想达到MD5、SHA1碰撞效果也几乎是不可能的。
4、关于单线程下载和多线程下载是否会对下载文件的准确性有影响,像电驴、迅雷都是按照HASH码进行合法校验“拼装”的,除非是软件出了错误,否则单线程多线程跟最终下载结果没有区别,从微软服务器下载跟从山寨网站下载结果也没有区别。
上图是我对Windows 7 SP1 ISO镜像文件的校验。本站提供的这个小软件名为 Hash 1.04 ,经测试,不管是在校验速度还是稳定性上,都是一流的。体积也超小,才20多K。它默认同时计算MD5、SHA1和CRC32值。最不最佳不是由我说了算,只是个人觉得这一款非常非常好用。上面说了,单单只计算MD5值是有可能相同的,但是如果两个不同的文件三个值都相同,那我觉得%99.9(后面N个9)不可能,也就是说保证绝对的唯一性。