1) 文件校验
咱们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并无抗数据篡改的能力,它们必定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。 java
MD5 Hash算法的"数字指纹"特性,使它成为目前应用最普遍的一种文件完整性校验和(Checksum)算法,很多Unix系统有提供计算md5 checksum的命令。它常被用在下面的2种状况下: 算法
第一是文件传送后的校验,将获得的目标文件计算 md5 checksum,与源文件的md5 checksum 比对,由二者 md5 checksum 的一致性,能够从统计上保证2个文件的每个码元也是彻底相同的。这能够检验文件传输过程当中是否出现错误,更重要的是能够保证文件在传输过程当中未被恶意篡改。一个很典型的应用是ftp服务,用户能够用来保证屡次断点续传,特别是从镜像站点下载的文件的正确性。 数据库
更出色的解决方法是所谓的代码签名,文件的提供者在提供文件的同时,提供对文件Hash值用本身的代码签名密钥进行数字签名的值,及本身的代码签名证书。文件的接受者不只能验证文件的完整性,还能够依据本身对证书签发者和证书拥有者的信任程度,决定是否接受该文件。浏览器在下载运行插件和java小程序时,使用的就是这样的模式。 小程序
第二是用做保存二进制文件系统的数字指纹,以便检测文件系统是否未经容许的被修改。很多系统管理/系统安全软件都提供这一文件系统完整性评估的功能,在系统初始安装完毕后,创建对文件系统的基础校验和数据库,由于散列校验和的长度很小,它们能够方便的被存放在容量很小的存储介质上。此后,能够按期或根据须要,再次计算文件系统的校验和,一旦发现与原来保存的值有不匹配,说明该文件已经被非法修改,或者是被病毒感染,或者被木马程序替代。TripWire就提供了一个此类应用的典型例子。 浏览器
更完美的方法是使用"MAC"。"MAC" 是一个与Hash密切相关的名词,即信息鉴权码(Message Authority Code)。它是与密钥相关的Hash值,必须拥有该密钥才能检验该Hash值。文件系统的数字指纹也许会被保存在不可信任的介质上,只对拥有该密钥者提供可鉴别性。而且在文件的数字指纹有可能须要被修改的状况下,只有密钥的拥有者能够计算出新的散列值,而企图破坏文件完整性者却不能得逞。 安全
2) 数字签名
Hash 算法也是现代密码体系中的一个重要组成部分。因为非对称算法的运算速度较慢,因此在数字签名协议中,单向散列函数扮演了一个重要的角色。 函数
在这种签名协议中,双方必须事先协商好双方都支持的Hash函数和签名算法。 工具
签名方先对该数据文件进行计算其散列值,而后再对很短的散列值结果--如Md5是16个字节,SHA1是20字节,用非对称算法进行数字签名操做。对方在验证签名时,也是先对该数据文件进行计算其散列值,而后再用非对称算法验证数字签名。 网站
对 Hash 值,又称"数字摘要"进行数字签名,在统计上能够认为与对文件自己进行数字签名是等效的。并且这样的协议还有其余的优势: google
首先,数据文件自己能够同它的散列值分开保存,签名验证也能够脱离数据文件自己的存在而进行。
再者,有些状况下签名密钥可能与解密密钥是同一个,也就是说,若是对一个数据文件签名,与对其进行非对称的解密操做是相同的操做,这是至关危险的,恶意的破坏者可能将一个试图骗你将其解密的文件,充当一个要求你签名的文件发送给你。所以,在对任何数据文件进行数字签名时,只有对其Hash值进行签名才是安全的。
3) 鉴权协议
以下的鉴权协议又被称做"挑战--认证模式:在传输信道是可被侦听,但不可被篡改的状况下,这是一种简单而安全的方法。
须要鉴权的一方,向将被鉴权的一方发送随机串(“挑战”),被鉴权方将该随机串和本身的鉴权口令字一块儿进行 Hash 运算后,返还鉴权方,鉴权方将收到的Hash值与在己端用该随机串和对方的鉴权口令字进行 Hash 运算的结果相比较(“认证”),如相同,则可在统计上认为对方拥有该口令字,即经过鉴权。
1)生日攻击
利用“两个集合相交”问题的原理生成散列函数碰撞,达到目的的攻击称为生日攻击,也称为平方根攻击。
生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash的长度。
2)MD5安全性
MD5是一个较为古老的算法,一度被普遍应用于安全领域。好比在UNIX系统中用户的密码就是以MD5(或其它相似的算法)经加密后存储在文件系统中。当用户登陆的时候,系统把用户输入的密码计算成MD5值,而后再去和保存在文件系统中的MD5值进行比较,进而肯定输入的密码是否正确。
经过这样的步骤,系统在并不知道用户密码的明码的状况下就能够肯定用户登陆系统的合法性。这不但能够避免用户的密码被具备系统管理员权限的用户知道,并且还在必定程度上增长了密码被破解的难度。
不过,因为MD5的弱点被不断发现以及计算机能力不断的提高,经过碰撞的方法有可能构造两个具备相同MD5的信息,使MD5算法在目前的安全环境下有一点落伍。从实践角度,不一样信息具备相同MD5的可能性仍是很是低的,一般认为是不可能的,经过碰撞的方法也很难碰撞出复杂信息的MD5数值。
所以,MD5算法仍是被普遍的用做检验文件是否变化的散列函数,不少相似迅雷、旋风这样的下载工具,均可以经过MD5来验证,用户下载下来的文件是否被修改。
3)SHA-1安全性
SHA-1 算法是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS),被普遍用于:
尽管早在 2005 年其理论上的攻击方法就已经被熟知,SHA-1 也在 2011 年被 NIST 正式弃用,但依旧仍是有许多公司和我的在使用 SHA-1 算法。
2017 年 2 月 23 日,CWI Amsterdam 与 Google 宣布了一个实现了的 SHA-1 碰撞攻击。Google 但愿用这样的方式,推进业界尽快弃用 SHA-1,而使用安全性更高的算法,好比 SHA-256。
4)散列函数的安全性
Hash的安全要求:
(1)H可适用于任意长度的数据块。
(2)H可以生成固定长度的输出。
(3)对于任意给定的x,计算H(x)相对容易,而且能够用软/硬件实现。
(4)对于任意给定的h,找到知足H(x)=h的x在计算上不可行,知足这一特性的散列函数称之为:具有抗原像攻击性。
(5)对于任意给定的数据块x,找到知足H(y)=H(x)的y ≠ x在计算上是不可行;知足这一特性的散列函数称之为:抗弱碰撞性。
(6)找到知足H(x) = H(y)的任意一对(x,y)在计算上是不可行的。知足这一特性的散列函数称之为:抗碰撞性。
有两种方法能够攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度彻底依赖于算法生成的散列码长度。Van Oorschot和Wiener曾经提出,花费1000万美圆涉及一个被专门用来搜索MD5算法碰撞的机器,则平均24天内就能够找到一个碰撞。
2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内便可找到MD5的碰撞。MD5已经呗完全攻破。
5)安全散列函数的发展
SHA家族的五个算法,分别是SHA-一、SHA-22四、SHA-25六、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1在许多安全协定中广为使用,包括TSL和SSL,PGP,SSH、S/MIME和IPsec,曾被视为是MD5(更早以前被广为使用的杂凑函数)的后继者。但SHA-1的安全性现在被密码学家严重质疑;虽然至今还没有出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然类似;所以有些人开始发展其余替代的杂凑算法。
最初载明的算法于1993年发布,称作安全杂凑标准(Secure Hash Standard),FIPS PUB 180。这个版本如今常被称为SHA-0。它在发布以后很快就被NSA撤回,而且由1995年发布的修订版本FIPS PUB 180-1(一般称为SHA-1)取代。
(1)不一样的程序也会有相同的MD5;
(2)不能肯定网站是否被黑客入侵篡改,是否被植入病毒或木马;
(3)当软件过大时,在验证过程当中所需的时间也会大大增长,对于第三方而言,攻击的成功几率也会增长。
(4)若是有第三方在验证软件完整性时截取软件代码,使用快速MD5碰撞生成器,在短期内伪造一份相同的MD5,并恶意篡改软件,那么安全性将会大大降低。