2016012062散列函数的应用及其安全性

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

一、散列函数的说明

  散列函数,亦为哈希函数(Hash Function),一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

  对于散列,其概念属于查找,它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,查找的期望时间为O(1)。简单的说,Hash函数就是把任意长的输入字符串变化成固定长的输出字符串的一种函数,把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。其输出字符串的长度称为Hash函数的位数。

 2016012062散列函数的应用及其安全性_第1张图片

 

  散列(Hashing)通过散列函数将要检索的项与索引(散列,散列值)关联起来,生成一种便于搜索的数据结构(散列表)。

 

二、散列函数的具体应用

1.消息认证

——用来验证消息完整性的一种机制或服务

  消息认证确保收到的数据确实和发送时的一样(即没有修改、插入、删除或重放)。此外,通常还要求消息认证机制确保发送方声称的身份是真实有效的。当Hash函数用于提供消息认证功能时,Hash函数值通常称为消息摘要。

  消息认证中使用Hash函数的本质:

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

  Hash函数的运算结果必须通过安全的方式传输。

  Hash码能够通过如下各种不同的方法用于提供消息认证:

 2016012062散列函数的应用及其安全性_第2张图片

a) 使用对称密码E加密消息和Hash码,由于只有A和B共享密钥K,所以消息必然发自A处,且可通过验证Hash码证明数据在传输过程中未被更改。

b) 使用对称密码只对Hash码加密。由于明文无需加密性的应用,这种方案大大减少了加密操作的负担。

c) 不使用加密算法,仅使用Hash函数实现消息验证。该方案中,通信双方共享相同的秘密值S,发送方A将消息M和秘密值S串联后计算其Hash值,并将得到的Hash值附在消息M后发送。因为接收方B同时掌握S值,所以能够重新计算该Hash值进行验证。

d) 在方案c的基础上将整个消息和Hash值加密,以提供保密性。

  处于成本和速度方面的考虑,人们越来越对那些不包含加密函数的方法感兴趣,因此b和c方案更受青睐,不过如果对整个消息有加密型要求,则a和d仍具有实际意义。

  实际应用中,消息认证通常使用消息认证码(MAC)实现,即带密钥的Hash函数。MAC是Hash函数和加密函数操作的结合,它将通信双方共享的密钥和数据块作为输入,产生Hash值作为MAC码,然后将MAC码和受保护的消息一起传递或存储。需要检查消息的完整性时,使用MAC函数对消息重新计算,并将计算结果与存储的MAC码对比。MAC提供安全保护,用于抵抗不知道密钥的攻击者的攻击。在实现中,往往使用比加密算法效率更高的特殊设计的MAC函数。

2.数字签名

——与MAC相似,在进行数字签名的过程中使用用户的私钥加密消息的Hash值,其他任何知道该用户公钥的人都能够通过数字签名来验证消息的完整性。在这种情况下,攻击者想要篡改消息,则要知道用户的私钥。

  数字签名的应用比消息认证更为广泛。

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

 2016012062散列函数的应用及其安全性_第3张图片

 

 

a)使用发送方的私钥利用公钥密码算法对Hash码进行加密。这种方法也可提供认证;由于只有发送方可以产生加密后的Hash码,所以这种方法也提供了数字签名。

b)若既希望保证保密性又希望有数字签名,则先用发送方的私钥对Hash码加密,再用对称密码中的密钥对象消息和公钥算法加密结果进行加密,这种技术比较常用。

3.其他应用

  对于Hash函数,通常还被用于产生单向口令文件。在操作系统中,存储口令的Hash值而不是口令本身,当用户输入口令时,操作系统将比对输入口令的Hash值和存储在口令文件中的Hash值来进行用户验证。

  Hash函数还能用于入侵检测和病毒检测。将每个文件的Hash值H(F)存储在安全系统中(如CD-R),随后就能通过重新计算H(F)来判断文件是否被修改过。入侵者只能够改变F,而不能改变H(F)。

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

 

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

——结合生日攻击、以及20042005年王晓云教授有关MD5安全性和2017google公司SHA-1的安全性

生日攻击——利用概率论中的生日问题,找到冲突的Hash值,伪造报文,使身份验证算法失效。

生日悖论——如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。这就意味着在一个典型的标准小学班级(30人)中,存在两人生日相同的可能性更高。对于60或者更多的人,这种概率要大于99%。从引起逻辑矛盾的角度来说生日悖论并不是一种悖论,从这个数学事实与一般直觉相抵触的意义上,它才称得上是一个悖论。大多数人会认为,23人中有2人生日相同的概率应该远远小于50%。

MD5——Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4

MD5算法具有以下特点:

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。

SHA-1——全称 Secure Hash Algorithm-1,是一种安全加密算法,最主要的用途是数字签名。SHA-0 和 SHA-1 会从一个最大 2^64 位元的讯息中产生一串 160 位元的摘要,然后以设计 MD4 及 MD5 讯息摘要算法的 MIT 教授Ronald L. Rivest类似的原理为基础来加密。

 

散列函数的安全性

生日攻击——生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash值的长度。是对任何HASH都适用的普适的攻击方法,应对方法也很简单,增加HASH的长度,但是很难完成。

MD5——2004年8月中国密码学家王晓云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经被彻底攻破。

SHA-1算法——而早在 2014 年,Google 就宣布了逐渐放弃 SHA-1 的决定。去年开始,Google 的 Chrome 浏览器已经不再支持 SHA-1 证书,会将其标记为不安全。当证书过期之后,浏览器将无法访问这些网站。Google 方面也推荐 IT 人士采用 SHA-256 等更安全的算法。

 

安全散列函数的发展

(1)安全散列函数结构:

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

(2)Merkle-Damgard结构:

 

 2016012062散列函数的应用及其安全性_第4张图片

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

(3)散列函数发展:

  安全Hash算法SHA(secure hash algorithm) 由美国标准与技术研究所(NIST)设计并1993年作为联邦信息处理标准(FIPS 180)发布,修改版于1995年发布,通常称之为SHA1,该标准称为安全Hash函数。

  MD4是麻省理工学院教授Ronald Rivest于1990 年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行。其摘要长度为128位。这个算法影响了后来的算法如MD5、SHA 家族和RIPEMD等。MD5算法是1991年发布的一项数字签名加密算法,它当时解决了MD4算法的安全性缺陷,成为应用非常广泛的一种算法。

  MD5多年前被设计用于安全用途,是一种计算方便,碰撞概率极低的Hash算法,不过现在已经不安全了。

 

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

——结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exegoodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果

 

1.md5中的选择前缀碰撞

  MD5就是这样一个在国内外有着广泛的应用的杂凑函数算法,它曾一度被认为是非常安全的。然而,王小云教授发现,可以很快的找到MD5的“碰撞”,就是两个文件可以产生相同的“指纹”。构造前缀碰撞可以生成两个不同的文件,而这两文件的md5却是一样的。这意味着,当你在网络上使用电子签名签署一份合同后,还可能找到另外一份具有相同签名但内容迥异的合同,这样两份合同的真伪性便无从辨别。王小云教授的研究成果证实了利用MD5算法的碰撞可以严重威胁信息系统安全,这一发现使目前电子签名的法律效力和技术体系受到挑战。

  选择前缀攻击是构造两个不同的消息s1和s2,他们不必有共同的前缀,但是经过在尾部附加不同的“碰撞块”后,两个消息的散列值相同。

2.可能出现的问题

 2016012062散列函数的应用及其安全性_第5张图片

  这两个不同功能的程序会在屏幕上打印出不同的字符,(图中为其中一个的执行结果)但是它们的MD5都是一致的。不同内容不同功能的可执行文件可以伪造MD5码,如果仅仅是想要生成 MD5 相同而内容不同的文件的话,在任何主流配置的电脑上用几秒钟就可以完成了。MD5 算法不应再被用于任何软件完整性检查或代码签名的用途。即md5算法已经不安全,即使验证成功,文件也已经有可能被篡改或者加入木马病毒,则以上体现出的安全问题已经十分严重,即可能出现的问题。

 

 

 

相关链接:

https://blog.csdn.net/ywok526/article/details/38540885

https://www.cnblogs.com/block2016/p/5623902.html

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



你可能感兴趣的:(2016012062散列函数的应用及其安全性)