数据摘要算法的测试效率(SHA、MD5和CRC32)

一、算法概述

数据摘要算法是密码学算法中很是重要的一个分支,它经过对全部数据提取指纹信息以实现数据签名、数据完整性校验等功能,因为其不可逆性,有时候会被用作敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法或散列算法。php

1.1 CRC八、CRC1六、CRC32

CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长,应用也十分普遍,尤为是通信领域,如今应用最多的就是 CRC32 算法,它产生一个4字节(32位)的校验值,通常是以8位十六进制数,如FA 12 CD 45等。CRC算法的优势在于简便、速度快,严格的来讲,CRC更应该被称为数据校验算法,但其功能与数据摘要算法相似,所以也做为测试的可选算法。html

  在 WinRAR、WinZIP 等软件中,也是以 CRC32 做为文件校验算法的。通常常见的简单文件校验(Simple File Verify – SFV)也是以 CRC32算法为基础,它经过生成一个后缀名为.SFV 的文本文件,这样能够任什么时候候能够将文件内容 CRC32运算的结果与 .SFV 文件中的值对比来肯定此文件的完整性。与 SFV 相关工具软件有不少,如MagicSFV、MooSFV等。python

1.2 MD2 、MD四、MD5

  这是应用很是普遍的一个算法家族,尤为是 MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由MD二、MD三、MD4发展而来,由Ron Rivest(RSA公司)在1992年提出,目前被普遍应用于数据完整性校验、数据(消息)摘要、数据加密等。MD二、MD四、MD5 都产生16字节(128位)的校验值,通常用32位十六进制数表示。MD2的算法较慢但相对安全,MD4速度很快,但安全性降低,MD5比MD4更安全、速度更快。算法

  目前在互联网上进行大文件传输时,都要得用MD5算法产生一个与文件匹配的、存储MD5值的文本文件(后缀名为 .md5或.md5sum),这样接收者在接收到文件后,就能够利用与 SFV 相似的方法来检查文件完整性,目前绝大多数大型软件公司或开源组织都是以这种方式来校验数据完整性,并且部分操做系统也使用此算法来对用户密码进行加密,另外,它也是目前计算机犯罪中数据取证的最经常使用算法。与MD5 相关的工具备不少,如 WinMD5等。segmentfault

1.3 SHA一、SHA25六、SHA38四、SHA512

  SHA(Secure Hash Algorithm)是由美国专门制定密码算法的标准机构——美国国家标准技术研究院(NIST)制定的,SHA系列算法的摘要长度分别为:SHA为20字节(160位)、SHA256为32字节(256位)、 SHA384为48字节(384位)、SHA512为64字节(512位),因为它产生的数据摘要的长度更长,所以更难以发生碰撞,所以也更为安全,它是将来数据摘要算法的发展方向。因为SHA系列算法的数据摘要长度较长,所以其运算速度与MD5相比,也相对较慢。安全

  目前SHA1的应用较为普遍,主要应用于CA和数字证书中,另外在目前互联网中流行的BT软件中,也是使用SHA1来进行文件校验的。服务器

1.4 RIPEMD、PANAMA、TIGER、ADLER32 等

  RIPEMD是Hans Dobbertin等3人在对MD4,MD5缺陷分析基础上,于1996年提出来的,有4个标准12八、160、256和320,其对应输出长度分别为16字节、20字节、32字节和40字节。TIGER由Ross在1995年提出。Tiger号称是最快的Hash算法,专门为64位机器作了优化。网络

二、算法测试

2.1 测试方法

  • 测试范围 :常见的数据校验、摘要算法,主要有 CRC3二、MD五、SHA一、SHA25六、SHA38四、SHA512
  • 样本数据 :2G大小Vmware 虚拟机操做系统的磁盘文件,其中包含其中各类类型的文件,如二进制文件和文本文件等。
  • 软件平台 :Windows、.NET Framework 2.0
  • 硬件平台 :
    • 机器A(SCSI Disk):软件配置 Windows 2000 + .Net Framework 2.0;硬件配置 CPU:4 (Xeon),2.8G,RAM:2G ,HD:70 GB SCSI
    • 机器B(IDE Disk):软件配置 Windows 2003 + .Net Framework 2.0;硬件配置 CPU:1 (P4),2.8G,RAM:1G,HD:40 GB IDE

  考虑到整个测试过程只是涉及到文件读取与哈希值的计算,并没有过多的与操做系统、软件平台、开发语言相关的操做,所以能够认为上述测试方法的结果具备广泛性,即也适用于其它操做系统平台(如Linux/Unix)或应用语言/平台(C、Java)。多线程

2.2 测试结果

  1)不一样配置机器间的对比函数

  在不一样机器配置上的平均运算结果以下表所示:

  注1:配有SCSI磁盘的机器运行时间反而比 IDE 磁盘时间长,多是因为前者具备较多的应用负载形成的,如Oracle、WebSphere等,并且其OS为 Windows 2000,在之上运行 .NET 应用程序可能与 Windows 2003 的效率有所差异

  注2:上述算法中,只有 CRC32 没有包含在.NET Framework 中,而是使用C#单独实现的,所以可能会对其测试结果带来一些影响。

  2)不一样算法的CPU占用率比较

  在不一样的算法运行时,在机器B上监控其对于 CPU 的平均使用时间,结果以下表所示:

三、实验结论

  • 数据摘要算法的处理是很快的,在通常配置的PC机上使用MD5算法,处理1G的文件数据只需20-30秒(有些专用设备声称达 3GB/秒),不会对应用或机器带来过多负载
  • MD五、SHA1虽然被发现存在缺陷(碰撞),但在近几年内,仍然能够大量使用
  • SHA256/384/512 的速度较慢,能够用于少许数据摘要,目前不适合用于大文件校验

  CRC32为32bit的简单hash,MD5为128bit较复杂的hash算法。直觉上貌似CRC32的计算速度要比MD5快的。今天用FlexHEX计算大文件的hash时发现CRC32相对MD5并无明显优点。

  实验发现:Linux操做系统下用md5sum和cksum取文件哈希:MD5仅花费CRC32时间的72%左右。

  • MD5计算速度要明显优于CRC32!

四、文章来源

    1)http://dearymz.blog.163.com/blog/static/205657420116205415458/

    2)http://www.getcn.net/index.php?mod=skill&action=detail&id=43881

 

备注:以上关于MD5和CRC的比较应该是错误的。由于MD5和CRC测试的

网上有人用python计算MD5和crc的速度。

https://segmentfault.com/a/1190000004000838

PASS
BenchmarkCrc32-4 20000000 64.9 ns/op
BenchmarkMd5-4 5000000 274 ns/op
ok test 3.022s

md5大体慢4倍左右

CRC3二、MD五、SHA1概念及可靠性现状

转自http://www.metsky.com/archives/337.html

昨天介绍了Windows 7的版本识别问题,不得不提到经常使用的CRC3二、MD五、SHA1等校验算法可靠性问题,若是只是单纯的编码理论,天缘还算是能够看懂,但对密码学总体认识毕竟不是行内人,因此也只能从一些皮毛概念上简单介绍一下,实际上这些算法自己并不复杂,但每种算法的创立都是伟大壮举,这里天缘也把他们(W. Wesley Peterson和Ronald L. Rivest)请到摘要里,感恩一下。

如今网上流传最广的文件校验方式是MD5和SHA1,微软发布的操做系统如今都是采用CRC32结合SHA1发布。这三种算法中属CRC最年长,也是应用最普遍,若是不考虑碰撞的条件下,这些算法均可以发现传输或保存的信息受到的损坏或篡改,好比文件校验能够防止文件被恶意篡改,数字签名能够保护合法者不被仿冒,系统鉴权一方面要保护用户存储信息不受侵害,还须要保护信息传输过程不受干扰破坏等等,下面具体看一下。

 

一、CRC校验

CRC全称Cyclic Redundancy Check,又叫循环冗余校验。它是一种散列函数(HASH,把任意长度的输入经过散列算法,最终变换成固定长度的摘要输出,其结果就是散列值,按照HASH算法,HASH具备单向性,不可逆性),用来检测或校验传输或保存的数据错误,在通讯领域普遍地用于实现差错控制,好比通讯系统多使用CRC12和CRC16,XMODEM使用CRC16等等(十二、1六、32等值均是指多项式的最高阶N次幂),天缘早前在作通讯方面工做时也是最经常使用到这个校验方法,由于其编解码方法都很是简单,运算时间也很短。

但从理论角度,CRC不能彻底可靠的验证数据完整性,由于CRC多项式是线性结构,很容易经过改变数据方式达到CRC碰撞,天缘这里给一个更加通俗的解释,假设一串带有CRC校验的代码在传输中,若是连续出现差错,当出错次数达到必定次数时,那么几乎能够确定会出现一次碰撞(值不对但CRC结果正确),但随着CRC数据位增长,碰撞概率会显著下降,好比CRC32比CRC16具备更可靠的验证性,CRC64又会比CRC32更可靠,固然这都是按照ITU规范标准条件下。

正由于CRC具备以上特色,对于网络上传输的文件类不多只使用CRC做为校验依据,文件传输相比通讯底层传输风险更大,很容易受到人为干预影响。

二、MD5

MD全称Message Digest,又称信息摘要算法,MD5从MD2/3/4演化而来,MD5散列长度一般是128位, 也是目前被大量普遍使用的散列算法之一,主要用于密码加密和文件校验等。MD5的算法虽然很是“牢靠”,不过也已经被找到碰撞的方法,网上虽然出现有些碰撞软件,天缘没用过,但能够确定,实际做用范围至关有限,好比,及时黑客拿到了PASSWORD MD5值,除了暴力破解,即便找到碰撞结果也未必可以影响用户安全问题,由于对于密码还要限定位数、类型等,可是若是是面向数字签名等应用,可能就会被破解掉,不过,MD5同下文的SHA1还是目前应用最普遍的HASH算法,他们都是在MD4基础上改进设计的。

三、SHA1

SHA全称Secure Hash Standard,又称安全哈希标准,SHA家族算法有SHA-一、SHA-22四、SHA-25六、SHA-384和SHA-512(后四者一般并称SHA2),原理和MD四、MD5原理类似,SHA是由美国国家安全局(NSA)所设计,由美国国家标准与技术研究院(NIST)发布。SHA可将一个最大2^64位(2305843009213693952字节)信息,转换成一串160位(20字节)的散列值(摘要信息),目前也是应用最普遍的HASH算法。同MD5同样,从理论角度,SHA1也不是绝对可靠,目前也已经找到SHA1的碰撞条件,但“实用”的碰撞算法软件还没出现。因而美国NIST又开始使用SHA2,研究更新的加密算法。

校验工具下载:

三 款主流文件校验码工具HashCalc、WinMD五、Hasher

补 充

一、上文“碰撞”的解释,碰撞就是不一样明文经过HASH后的结果相同。

二、MD5和SHA1都具备高度的离散性,哪怕是只修改一个字节值都会致使MD5或SHA1值“巨大”变化,从实践角度,不一样信息具备相同MD5或SHA1码 的可能性很是低,一般认为是不可能的。

三、对于普通的下载文件或操做系统,想经过简单的修改某个字节或某些字节,又要保证文件名、大小和安装可靠性的前提下,想达到MD五、SHA1碰撞效果也几乎是不可能的。

四、关于单线程下载和多线程下载是否会对下载文件的准确性有影响,像电驴、迅雷都是按照HASH码进行合法校验“拼装”的,除非是软件出了错误,不然单线程多线程跟最终下载结果没有区别,从微软服务器下载跟从山寨网站下载结果也没有区别。

五、总之,有生之年,你们能够不相信CRC,可是MD5和SHA1绝对值得信赖,敬请放心,他们比天气预报要可靠的多了。

相关文章
相关标签/搜索