散列函数的安全性问题

散列函数的安全性问题

 

 

目录:

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

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

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

 

一、散列函数的具体应用

Hash函数被广泛的应用于各种不同的安全应用和网络协议中。

1.消息认证

   消息认证是用来验证消息完整性的一种机制和服务。消息认证确保收到的数据确实和发送时的一样,还要求消息认证机制确保发送方声称的身份是真实有效的。当Hash函数用于提供消息认证功能时,Hash函数值通常被称为消息摘要。

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

   发送方根据待发送的消息使用该函数计算一组Hash值,然后将Hash值和消息一起发送过去。接收方接收后对于消息执行同样的Hash计算,并将结果与收到的Hash值进行比较。如果匹配,则消息准确。反之,消息遭受了篡改。

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

 

 

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

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

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

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

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

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

2.数字签名

  • 数字签名的应用比消息认证更广泛。
  • 在进行数字签名时,使用用户的私钥加密消息的Hash值,其他任何知道该用户公钥的人都能够通过数字签名来验证消息的完整性。
  • Hash码用于提供数字签名的方案主要有以下两种:

 

 

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

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

3.产生单向口令文件

在操作系统中,存储口令的Hash值而不是口令本身,当用户输入口令时,操作系统将比对输入口令的Hash值和存储在口令文件中的Hash值来进行用户验证。

4.用于入侵检测和病毒检测

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

5.用于构建随机函数PRF或用作伪随机数发生器。

6.基于Hash函数的PRF可用于对称密码中的密钥产生。

-------------------------------------------------------------

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

1.密码学Hash函数H的安全性要求:

① 输入长度可变——H可适用于任意长度的数据块。         

② 输出长度固定——H能够生成固定长度的输出。         

③ 效率——对于任意给定的x,计算H(x)相对容易,并且可以用软/硬件实现。         

④ 抗原像攻击(单向性)——对于任意给定的h,找到满足H(x)=h的x在计算上不可行,    

⑤ 抗第二原像攻击(抗弱碰撞性)——对于任意给定的数据块x,找到满足H(y)=H(x)的y ≠ x在计算上是不可行;         

⑥ 抗碰撞攻击(抗强碰撞性)——找到满足H(x) = H(y)的任意一对(x,y)在计算上是不可行的。

⑦ 伪随机性——H的输出满足伪随机性测试标准

  前三个特性是使用散列函数实际应用的需求。第四个条件,抗原像攻击,防止攻击者能够回复秘密值。抗弱碰撞性保证了对于给定的消息,不可能找到具有相同散列值的可替换消息。

  满足前五个条件的Hash函数,称为弱Hash函数。满足前六个条件的,称为强Hash函数。

2.散列函数的安全性:

  • 对于Hash函数的攻击分为两类:穷举攻击和密码分析。

穷举攻击:

  • 不依赖于任何算法的细节,仅与相应的长度有关。2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经被彻底攻破。
  • 对于长度为m的Hash码,对于穷举攻击所需付出的代价分别于下表中相应量成正比.(通过生日悖论进行穷举攻击)

抗原像攻击

2m

抗弱碰撞攻击

2m

抗强碰撞攻击

2m/2

 

 

密码分析:

依赖于具体算法的设计缺陷,利用算法的某种性质。理想的Hash函数要求密码分析攻击所需的代价大于或等于穷举攻击所需的代价。

3.安全Hash算法(SHA)

  • 近些年,应用最广泛的散列函数是SHA。由于其他每一种被广泛应用的散列函数都已经被证实存在这密码分析学中的缺陷,接着到2005年,SHA或许仅存的安全散列算法。SHA由美国国家标准与技术研究院(NIST)开发。
  • 直到2017年2月23日,Google经过两年的研究,表示其已经成功破解了SHA-1加密谷歌公司多年来一直主张弃用SHA-1方案,特别是在TLS证书签署等场景之下。早在2014年,Chrome小组就宣布将逐渐淘汰对SHA-1的使用。Google希望自己针对SHA-1完成的实际攻击能够进一步巩固这一结论,让更多人意识到其已经不再安全可靠。
  • 谷歌亦希望这一针对SHA-1的实际攻击案例能够最终说服整个技术业界尽快转向更为安全的替代性方案,例如SHA-256SHA-3

 

● 1995年公布SHA-1
● 2002年,公布了SHA-2(SHA-256、SHA-384、SHA-512)
● 2008年,增加了SHA-224

SHA算法各个版本参数比较:

以SHA-512为例做一下介绍。该算法以最大长度不超过2128比特作为输入,生成512比特的消息摘要输出。输入以1024比特的数据块进行处理。过程重要包括以下步骤:

  • 步骤1:附加填充位
  • 步骤2:附加长度
  • 步骤3:初始化Hash缓冲区
  • 步骤4:以1024位的分组为单位处理消息
  • 步骤5:输出

SHA-512算法使得散列码的任意比特都是输入端每1比特的函数。基本函数F的复杂迭代产生很好的混淆效果;即随机取两组相似的消息也不可能生成相同的散列码。

 

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

  • MD5Message Digest Algorithm MD5 为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
  • MD5选择前缀碰撞:

选择前缀冲突——前缀冲突只要求在碰撞后文件应该完全相等。在碰撞之前,要找到碰撞的两个文件可以是任何东西:我们所选择的前缀碰撞查找方法总是会产生一个冲突,该冲突可以被合并到两个文件中,而不管碰撞之前存在什么数据。

 

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

  老师所给链接中的HelloWorld-colliding.exeGoodbyeWorld-colliding.exe

  虽然执行的结果不同,但是两个文件的MD5相同。

 

执行结果如图(GoodbyeWorld-colliding.exe):

 

 

  • 密码学家使用的是“构造前缀碰撞法”(chosen-prefix collisions)来进行此次攻击(是王小云所使用的攻击方法的改进版本)。
  • 他们的结论:MD5 算法不应再被用于任何软件完整性检查或代码签名的用途。
  • 现在,如果仅仅是想要生成 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

 

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

 

MD5算法可以被用来验证文件的完整性和是否被篡改,通过对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的 hash 值, 不同的文件产生相同的hash的可能性是非常小的。MD5在实际应用中通常有两种用法,一种是计算一个字符串的MD5值,常用于密码相关的操作;另一种是用于计算一个文件的MD5值,一般用于网络传输中验证文件是否出错。

 

  1. 不能确保文件的完整性。尤其是不能确保在文件传输、磁盘错误或其他无恶意涉入的情况下文件的正确性。
  2. 不能确保自己从网络下载的文件,是否就是原发布者所提供的文件。
  3. 不能通过校验MD5知道网站是否被黑客入侵篡改,是否曾被恶意植入病毒或木马

 

参考文档:快速MD5碰撞生成器,MD5真的不可靠了.

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

 

 

posted @ 2018-05-10 18:38  MfangM  阅读(4437)  评论(0编辑  收藏  举报