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

一、散列函数的具体应用

 

1.文件检验

    校验算法有奇偶检验和CRC校验,都没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。MD5 有"数字指纹"的特性,所以他成为一种文件完整性校验和(Checksum)算法,部分unix提供了计算checksum的命令。

 

2.数字签名

    在数字签名中,单向散列函数很重要。Hash作为现代密码体系中的重要组成部分,可以用于数字签名。HASH函数,又称杂凑函数,它有一种类似于指纹的应用。在网络安全协议中,杂凑函数用来处理电子签名,将很长的签名文件缩短为少量的数字信息。Hash值,又可以叫做"数字摘要",在统计上可以认为与对文件本身进行数字签名是等效的,而且这样的协议还有其他的优点。

 

3.鉴权协议

    在传输信道是可被侦听,但不可被篡改的情况下,挑战--认证模式是一种简单而安全的方法。

 

4.快速访问

    散列表的寻址时间复杂度为0(1),在数据存储中运用较多,这里不作详述。

 

5.安全访问认证

    MD5广泛用于操作系统的登陆认证上,如在Unix系统中用户的密码是以MD5 (或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash 运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。

消息认证如下图:

  

 

 

6.伪随机数生成

通过散列化处理对所传输数据的完整性进行安全校验,如下图:

 

 

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

1.散列函数的安全性有涉及三个方面。

 

    安全性的解析如下图:

 

    第一方面,生日攻击。

    生日攻击利用“两个集合相交”问题的原理生成散列函数碰撞,达到目的的攻击称为生日攻击,也称为平方根攻击。生日攻击方法没有利用Hash函数的结构和任何代数弱性,它只依赖于消息摘要的长度,即散列值的长度。中间相遇攻击是生日攻击的一种变形,它不看Hash值,而是比较链中的中间变量。中间相遇攻击的基本原理为:将消息分成两部分,对伪造消息的第一部分从初试值开始,逐步向中间阶段产生r1个变量;对伪造消息的第二部分从Hash结果开始逐步退回中间阶段产生r2个变量。在中间阶段有一个匹配的概率与生日攻击成功的概率一样。

 

    第二方面,MD5的破解。

    王小云教授发表了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告。我们知道,MD5是一个有广泛的应用的杂凑函数,它一度被认为是安全的。然而,王小云教授发现,可以找到MD5的“碰撞”,也就是两个文件有相同的“指纹”。换句话说,当使用电子签名签合同后,还可能找到另外一份具有相同签名但内容不同的合同,这样两份合同的真伪不能分辨。所以,王小云教授的结论证实:用MD5的碰撞会非常严重威胁信息安全,这对电子签名的技术体系是一种挑战。

 

    第三方面,SHA-1的破解。

    Google宣布攻破SHA-1,从此SHA-1不安全。寻找SHA-1碰撞,2013年,Marc Stevens发表一篇论文,专门介绍了创建SHA-1碰撞的理论性方法。下面这些数字是计算任务的规模水平:总计900万兆(即百万的五次幂,具体为9,223,372,036,854,775,808)次SHA1计算。要完成攻击的首个阶段需要单一CPU计算6500年。要完成攻击的第二阶段需要单一GPU计算110年。虽然这些数字巨大,但SHA-1破坏性攻击的速度,比暴力破解攻击多10万倍,意味着前者确实有可行性。

 

2.安全散列函数的发展。

  

  目前使用最多的哈希函数有MD(Message-Digest Algorithm)系列(MD4、MD5、HAVAL、RIPEMD)和SHA系列(SHA-1、SHA-256)。

MD4

    1990年Ronald L. Rivest设计,通过3圈的操作将任意长度的消息变换成128位的哈希值。

MD5

    MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,经过一系列处理之后,其输出是4个32位字的级联,与 MD4 相同。MD5算法被王小云证明是可攻破的,因此也已经不安全了。MD5与MD4的区别:MD5用了4轮变换,比MD4多一轮;MD4中第一轮没有常量加,MD5中64步每一步用了一个不同的常量K[i];MD5每轮加上前一步的结果,MD4没有。

 

    大部分安全散列函数都是迭代结构的。图中Mi为被分成L块的原始信息,f为杂凑函数,IV为初始向量。

四轮中的F函数各不相同,分别为:

F(X,Y,Z) =(X&Y)|((~X)&Z)

G(X,Y,Z) =(X&Z)|(Y&(~Z))

H(X,Y,Z) =X^Y^Z

I(X,Y,Z)=Y^(X|(~Z))

HAVAL

    HAVAL是MD5的改进版本,其轮数可以是3、4或5(每轮16步),输出长度分别为128、160、192或224位。HAVAL用高非线性的7-变量函数取代了MD5的简单非线性函数。

SHA1

    SHA由美国国家标准技术研究所NIST开发,与1993年发表,SHA-1是基于MD4设计的。输入最大长度为2^64位的数据,输出160位的消息摘要,同样以512位数据块进行处理。具体这里不详述。

SHA-256

    输出由SHA-1的160位扩大到256位,迭代次数由SHA-1的80次增加到128次

SHA-384

    输出扩大到384位,迭代次数增加到192次

SHA-512

    输出扩大到512位,迭代次数增加到256次

 

输入位数

输出位数

迭代次数

分组长度

找到碰撞

MD4

无限

128bit

48

512bit

MD5

无限

128bit

64

512bit

SHA-1

264-1

160bit

80

512bit

理论260

SHA-2

SHA-256

264-1

256bit

64

512bit

SHA-384

2128-1

384bit

80

1024bit

SHA-512

2128-1

512bit

80

1024bit

SHA-3

 

224/256/384/512

24

 

 

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

 

    第一方面,md5算法中的选择前缀碰撞

    选择前缀碰撞是指选取一对任意的MD5消息前缀后,再构造一对后缀使得两部分级联后的消息对发生碰撞。

 

    第二方面,两个可执行文件的md5消息摘要值

    两个文件如下图:

 

    HelloWorld.exe和GoodbyeWorld.exe是两个不同的可执行文件,下载效验工具MD5校验工具,下图下载成功:

 

    点击“浏览”,选择HelloWorld-colliding.exe文件,然后如下图,MD5: 18FCC4334F44FED60718E7DACD82DDDF



    点击“浏览”,选择GoodbyeWorld-colliding.exe文件,然后如下图,MD5: 18FCC4334F44FED60718E7DACD82DDDF

 

    发现新的两个文件的MD5是相同的,但在窗口上两者输出的字符不同,这就找到了MD5的一对碰撞。附加选择前缀碰撞的好处在于,任何程序可以毫无影响地与其它任何程序碰撞。所以,MD5 算法不应再被用于任何软件完整性检查或代码签名的用途。

 

    第三方面,两个不同的文件的执行结果

 

  HelloWorld.exe文件的执行结果,命令串窗口执行,出现“Hello World:- )”的结果:

 

  GoodbyeWorld.exe文件直接鼠标双击的执行结果,死循环“Goodbye World :-(”语句:

     总之,MD5值文件可以伪造,那么文件完整性得不到保障,而且文件签名也不能实现。

 

参考链接:

链接1:https://www.win.tue.nl/hashclash/

链接2:http://www.win.tue.nl/hashclash/SoftIntCodeSign/

 

 

 

posted @ 2018-05-13 21:39  白雪儿  Views(2176)  Comments(1Edit  收藏  举报