2016012028 赵莉 散列函数的应用及其安全性

目录:

一、散列函数的具体应用;

二、散列函数的安全性以及目前安全散列函数的发展;

三、md5算法来验证软件完整性时可能出现的问题。

 

一.散列函数的具体应用

密码学中,Hash函数被广泛应用于各种不同的安全应用和网络协议中。以下是散列函数的一些具体应用。

(一)课本知识

1.消息认证

(1)消息认证概念:消息认证是用来验证消息完整性的一种机制和服务。消息认证确保收到的消息和发送时的一样的(即没有修改、插入、删除或重放)。通常还要求消息认证机制确保发送方声称的身份是真实有效的,当Hash函数用于提供消息认证功能时,被称为消息摘要。

(2)消息认证中使用Hash函数的本质:发送者根据待发送的消息使用该函数计算一组Hash值,然后将Hash值和消息一起发送过去。接收者收到后对于消息执行同样Hash计算,并将结果与收到的Hash值进行对比。如果不匹配,则接收者推断出消息(或Hash值)遭到了篡改。

(3)Hash码能够通过如下不同方法提供消息认证:

     a.使用对称密码算法加密消息和Hash码。

     b.使用对称密码算法只对Hash码进行加密。(如果不要求提供保密性,b比a、d更有优势)

     c.不使用加密算法,仅使用Hash函数实现消息认证。(假设通信双方共享私密值S)

     d.通过将整个消息和Hash值加密,能够在c的基础上提供保密性。

(4)一般情况,消息认证是通过消息认证码MAC实现的,即带密钥的Hash函数。通信双方基于共享的同一密钥来认证彼此之间交互的信息时,就会使用MAC。MAC是Hash函数和加密函数操作的结合。并且提供了安全保护,用以抵抗不知道密钥的攻击者的攻击。

2.数字签名

(1)数字签名简述:数字签名的操作与MAC相似,在进行数字签名过程中使用用户的私钥加密消息的Hash值,其他人任何知道该用户公钥的人都能够通过数字签名来验证消息的完整性。数字签名的应用比消息认证更为广泛。

(2)Hash码用于提供数字签名的方案:

     a.使用发送方的私钥,利用公钥密码算法仅对Hash码进行加密。

     b.先用发送方私钥对Hash码加密,再用对称密码中的密钥对消息和公钥算法加密结果加密。

3.其他应用

(1)产生单向口令文件。操作系统存储口令的Hash值而不是口令本身,当用户输入口令时,操作系统将比对输入口令的Hash值和存储在口令文件中的Hash值(大多操作系统的口令保护机制)。

(2)入侵检测和病毒检测。将每个文件的Hash值H(F)存储在安全系统中,随后就能够通过重新计算H(F)来判断文件是否被修改过。

(3)密码学Hash函数能够用于构建随机函数PRF或用作伪随机数发生器。基于Hash函数的PRF可用于对称密码中的密钥产生。

(二)查询资料

1.文件校验

譬如奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。

2.鉴权协议

需要鉴权的一方,向被鉴权的一方发送随机串(“挑战”),被鉴权方将该随机串和自己的鉴权口令字一起进行 Hash 运算后,返还鉴权方,鉴权方将收到的Hash值与在己端用该随机串和对方的鉴权口令字进行 Hash 运算的结果相比较(“认证”),如相同,则可在统计上认为对方拥有该口令字,即通过鉴权。

3.邮件相关

保密增强邮件 PEM(Privacy Enhanced Mail),因特网保密性增强邮件标准,提供的消息完整性检查中的鉴别使用的单项散列函数MD2和MD5;邮件加密软件PGP 中2.6.3版本中使用的单项散列函数是MD5。

 

二、结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展。

1.生日攻击

(1)将生日悖论的问题抽象成散列函数,教室里每个人作为函数的输入x,每个人对应的生日作为函数的输出y,那么可以写成H(x)= y,由于一年有365 天,所以y可以取的值有365种。这时候我们改变输入x取值范围,发现只要当x取值数大于23种时,y碰撞的几率就达到50%以上。

简单来说,生日攻击就是利用散列函数发生碰撞的可能性,进行n次尝试直到找到一对碰撞的输入。一个40比特长的消息摘要是很不安全的,大约一百万次随机Hash可至少以50%的概率找到一个碰撞。

(2) 防范方法

  • 使用安全的Hash算法:安全的Hash算法生成的Hash值有足够多的位数。这样,攻击者在寻找两个具有相同Hash值的文件时就会非常困难。

  • 加盐:在为文件签名之前,先向文件添加一个随机值,然后计算Hash值,再将文件、签名和随机值一起发送给接收者。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。

  • 改动文件:在为文件签名之前,对消息或文件做少许改动。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。

2.MD5安全性和SHA-1的安全性

2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经被彻底攻破。在2017年,Google公司宣布实现了对SHA-1算法的攻击。SHA-1算法宣告攻破。不过需要注意的是,这次SHA-1算法破解的计算量相当于单个CPU计算6500年和单个GPU计算110年,因此就目前的PC硬件来看,依靠一台电脑完成破解是不现实的。然而密码学家认为,如果利用云计算技术来破解的话,这件事情将简单很多,可能只需要17万美元的预算即可完成,因此尽快改用安全性更高的SHA-2或SHA-3算法才是正确的做法。

3.散列函数的安全性

(1)通过对于生日攻击的了解,散列函数的安全性是有待提高的。生日攻击并没有利用任何HASH函数的性质,是对任何HASH都适用的普适的攻击方法,应对方法也很简单,增加HASH的长度,但是很难完成。

(2)有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。

(3)安全散列函数结构

因为所需的安全散列长度越来越长,因此我们可以使用有限定义域上的散列函数(俗称压缩函数)通过迭代方式拓展为具有无限定义域的散列函数。而最为代表性的就Merkle-Damgard结构
 

Merkle-Damgard结构:

这个结构的好处是,如果压缩函数是抗碰撞的,那经过此结构处理后的散列函数也是抗碰撞的。
SM3,HMAC就是基于这种结构,因为Merkle-Damgard结构并不能抵抗扩展攻击,因此HMAC引入了Key。

4.目前安全散列函数的发展

MD系列

 (1)MD2  Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。

(2)MD4  MD4是麻省理工学院教授Ronald Rivest于1990年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行。通过三圈的操作将任意长度的消息变换成128位的哈希值。

(3)MD5  Rivest于1991年对MD4的改进版本。运用了四轮变换,并且每轮加上前一轮的结果。

(4)HAVAL  为MD5的改进版本。轮数可以为3、4或5,输出长度分别为128、160、192或224位。

SHA系列

2005年MD5的攻破似乎宣告了SHA或许为仅存的安全散列算法。

(1)SHA-0:SHA由美国标准与技术研究所(NIST)设计并于1993年发表,该版本称为SHA-0,由于很快被发现存在安全隐患,

(2)SHA-1:1995年发布了SHA-1。

(3)SHA-2:2002年,NIST分别发布了SHA-256、SHA-384、SHA-512,这些算法统称SHA-2。2008年又新增了SHA-224。

(4)由于2017年SHA-1算法的攻破,目前已经有多家科技企业宣布逐步放弃SHA-1算法,微软已经确定会放弃在Edge以及IE浏览器上继续使用SHA-1算法的TLS证书,Google的Chrome在56版之后也会提示SHA-1加密的HTTPS网页并不安全,Mozilla则确定在今年7月开始停止SHA-1的支持。目前SHA-2各版本已成为主流。

 

三.结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法来验证软件完整性时可能出现的问题。

1.关于MD5

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

MD5算法的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

几位密码学家使用 “构造前缀碰撞法”(chosen-prefix collisions)来进行攻击(是王小云所使用的攻击方法的改进版本),他们所使用的计算机是一台Sony PS3,且仅用了不到两天。如果仅仅是想要生成MD5 相同而内容不同的文件的话,在任何主流配置的电脑上用几秒钟就可以完成。

结论:MD5 算法不应再被用于任何软件完整性检查或代码签名的用途。

2.选择前缀碰撞及第二个链接中的实验

构造前缀碰撞法可制作两个内容不同但具有相同MD5验证码的文件

从helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果可知,这两个程序会在屏幕上打印出不同的字符,但是它们的 MD5 都是一样的。

这几位密码学家使用“构造前缀碰撞法”(chosen-prefix collisions)来进行此次攻击(是王小云教授所使用的攻击方法的改进版本)。

现在,如果仅仅是想要生成 MD5 相同而内容不同的文件的话,在任何主流配置的电脑上用几秒钟就可以完成了。

密码学家们编写的“快速 MD5 碰撞生成器”:http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.zip
源代码:http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5_source.zip

3.MD5验证软件完整性时可能出现的问题

(1)两个不同的程序,MD5可能是相同的。

(2)不能通过校验MD5知道网站是否被黑客入侵篡改,是否曾被恶意植入病毒或木马。

(3)当软件过大时,在验证过程中所需的时间也会大大增加,对于第三方而言,攻击的成功概率也会增加。

(4)如果有第三方在验证软件完整性时截取软件代码,使用快速MD5碰撞生成器,在短时间内伪造一份相同的MD5,并恶意篡改软件,那么安全性将会大大下降。

 

四、参考博客

https://blog.csdn.net/ddk3001/article/details/52647990

https://blog.csdn.net/langchibi_zhou/article/details/2662213


 

posted @ 2018-05-11 15:03  zhaoliguaner  阅读(234)  评论(0编辑  收藏  举报