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

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

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

图中左边是W. Wesley Peterson,右边是Ronald L. Rivest

1、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作为校验依据,文件传输相比通信底层传输风险更大,很容易受到人为干预影响。

2、MD5

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

3、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,研究更新的加密算法。

校验工具下载:

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

补 充

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

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

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

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

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

参考资料:维基百科——CRC循环冗余校验MD5SHA

校验知识:CRC32、MD5、SHA1概念及可靠性现状的更多相关文章

  1. php crc32,md5,sha1,mhash测试结果

    总结:php  自带hash mhash 用于散列只能加密   扩展mcrypt 用于加解密 对文件加密有的文件会隐藏换行,或者读取方式等影响导致结果不一致. 1.crc32 php: a.系统crc ...

  2. mac上校验文件的 md5 sha-1

    文件校验 mac md5 sha-1html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMir ...

  3. Hash校验工具、MD5 SHA1 SHA256命令行工具

    MyHash 检验工具http://www.zdfans.com/html/4346.html HashMyFiles Hash校验工具http://www.nirsoft.net/utils/has ...

  4. linux中校验文件完整性(md5,sha1)

    经常在Linux下下载软件的人,一定会有一个良好的习惯:校验文件的hash,以确定文件的完整性甚至是安全性.我配置环境的时候也恰好用到了,笔者的是一个lubuntu的机子.这里我大致做个记录.(不了解 ...

  5. Linux下校验下载文件的完整性(MD5,SHA1,PGP)

    查看: Linux下校验下载文件的完整性(MD5,SHA1,PGP) http://blog.useasp.net/archive/2014/03/29/use-md5-sha1-or-pgp-to- ...

  6. 用python计算md5,sha1,crc32

    Linux下计算md5sum,sha1sum,crc: 命令 输出 $md5sum hello f19dd746bc6ab0f0155808c388be8ff0  hello $sha1sum hel ...

  7. 终端应用变身文件 MD5/SHA1 校验工具

    担心下载的文件被恶意篡改?没有找到 Mac 平台文件校验工具?其实 Mac OS X 系统中已经内置了“文件 MD5/SHA1 校验工具”,它就藏身于终端(Terminal)应用中! 打开终端应用,输 ...

  8. 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3

    [程序介绍]免费开源的 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3 这是一个有意思的程序,同一个程序,即是图形程序,又是命令行程序.程序作用:输入一个文件的路径,输出 ...

  9. MD5 SHA1 HMAC HMAC_SHA1区别

    MD5.SHA1.HMAC.HMAC_SHA1区别 引言     什么是MD5,什么是SHA1,如何校验这些Hash.还有拿单个apk文件的MD5,SHA1讯问是不是原版的问题,在这里,让我们先来了解 ...

随机推荐

  1. svn备份

    公司的svn体量很大,要是一不小心误删了SVN版本库,就要哭了,所以有了下面的备份脚本 #每个版本库完全备份 #!/bin/bash SOUR_SVN="/var/www/svn" ...

  2. [BZOJ1982][POJ1740][Spoj 2021]Moving Pebbles|解题报告

    这道题的题意BZ和POJ上的都不大清楚... 大概就是给出n堆石子,以及初始每堆石子的个数 两个玩家交替操作,每个操作可以任意在一堆中取任意多的石子 然后再从这堆里拿若干个石子放到某个当前还存在的堆里 ...

  3. 虚拟机VMware 安装CentOS6.5

    对linux完全小白的情况下,也能依据下面的文章,一步一步安装使用成功! CentOS 6.5 下载http://www.linuxdown.net/CentOS/2014/0928/3371.htm ...

  4. Backbone Model 源码简谈 (版本:1.1.0 基础部分完毕)

    Model工厂   作为model的主要函数,其实只有12行,特别的简练 var Model = Backbone.Model = function(attributes, options) { va ...

  5. c#使用selenium截图,操作dom元素

    using System; //添加selenium的引用 using OpenQA.Selenium.PhantomJS; using OpenQA.Selenium.Chrome; using O ...

  6. 【反演复习计划】【bzoj3529】数表

    Orz PoPoQQQ大爷 按照他ppt的解法,这题可以划归到之前的题了OrzOrz 跪wy写的题解(Stealth Assassin)https://www.luogu.org/wiki/show? ...

  7. PoI导出列表优化

    针对写了头信息之后,使用for循环遍历会导致数据丢失问题的优化,使用迭代器替代for循环,具体如下: public static boolean ExportDeptLeaderFileToLocal ...

  8. hadoop3.1伪分布式部署

    1.环境准备 系统版本:CentOS7.5 主机名:node01 hadoop3.1 的下载地址: http://mirror.bit.edu.cn/apache/hadoop/common/hado ...

  9. 一段js代码的分析

    function foo(a){ console.log(a+b); b=a+2; console.log(a+b); } foo(2); foo(3); var b=3; foo(4); 结果是: ...

  10. Mysql中使用存储过程返回查询多个表的数据信息

    -- 测试手机号 call P_Base_CheckLogin('); -- 测试登录名 call P_Base_CheckLogin('sch000001') -- 测试身份证号 call P_Ba ...