【信息安全作业5】散列函数的应用及其安全性

目录

  1. 散列函数的具体应用。

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

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

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

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

 

1.散列函数的具体应用

1、承诺方案

  一个承诺方案或一个位承诺方案允许一个用户承诺一个值而不揭示该值,同时允许用户在某个时刻揭示他所承诺的值。

  实例:发送者Alice将她所承诺的值锁在一个箱子里面,将箱子给接收者Bob,当Bob执行了特定操作后,Alice将钥匙给Bob以打开箱子。这样既保证了Alice承诺的值不被改变,又保证了Bob在特定的操作结束前不能知道Alice所承诺的值。由此可见,比特承诺可以适用于双方互不信任的环境。

2、口令认证

  通常口令认证不是以明文形式存储的,而是以摘要形式存储的。为了认证一个用户,将用户提供的口令的Hash值与存储的Hash值相比较,相同则认证通过,否则不通过。有时这也称为单向加密。这样就保证了从文件得到口令通常是行不通的。

  为了进一步保证输入的安全,利用Hash函数的单向性还可以实现一次口令,这种情况下,每次存储的均为输入口令,且要求用户下次输入口令的Hash值与本次的输入口令相同。

3、构造其它密码学原语

  Hash函数可以被用来构造带密钥的MAC(消息认证码)函数,最常见的是HMAC,HMAC可用于构造PRF(伪随机函数)。如TLS(传输层安全)协议中使用了两个基于HMAC的PRF,一个HMAC使用了MD5,另一个HMAC使用了SHA-1。

  SEAL是一个对软件有效的序列密码算法,该算法针对32-对处理器优化。SEAL实际上是一个伪随机函数族,其特点是可以轻易访问密钥序列中任何地方。而SEAL是基于Hash函数SHA-1的。

2.散列函数的安全性以及目前安全散列函数的发展

生日攻击

利用“两个集合相交”问题的原理生成散列函数碰撞,达到目的的攻击称为生日攻击,也称为平方根攻击。 

生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash值的长度。

 

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

场景说明

A要对一个合同文件进行签名,然后把合同文件和签名一起发送给接收者。
签名的方法:计算文件的Hash值(m位),然后使用A的私钥对这个Hash值进行加密。

接收者使用A的公钥进行解密,然后比较Hash值,这样他就能确认:
接收到的合同文件是A发送的,并且合同文件未被修改过。

攻击者B想要伪造一份假合同文件,然后发送给接收者,并使接收者仍然相信:
接收到的合同文件是A发送的,并且合同文件未被修改过。

防范方法

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

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

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

 

 MD5和SHA-1共性:

都被称作哈希(Hash)函数;

都是“不可逆”的函数。不存在一个算法能够由哈希值倒算出原始信息。

对原始信息的任何一点改变都会导致结果的哈希值巨大的不同。(假如原始数据是几百万字的文章,你在其中哪怕改动一个标点,计算出的哈希值都会有很大的变化。)

运算代价是相对较低的。普通的AMDOpteron 2.2GHz的芯片,每秒可以计算出335MB数据的MD5值,可以计算192MB数据的SHA-1值。

 

MD5和SHA-1差异:

正式的哈希函数的定义是“把任意长度的数据计算成固定长度的数据”。

也就是说函数的输入是任意长的,输出总是固定长度的。

MD5和SHA-1是两种加密用哈希函数,MD5的返回值总是128bit的,SHA-1的返回值是160bit,都是固定长度。

MD5如果按十六进制表示的话是32位十六进制的数,SHA-1是40位十六进制的数。


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

        有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。Van Oorschot和Wiener曾经提出,花费1000万美元涉及一个被专门用来搜索MD5算法碰撞的机器,则平均24天内就可以找到一个碰撞。2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经呗彻底攻破。MD5为16字节,速度最快;SHA-1是20字节,速度比MD5慢20%;SHA-256时32字节,速度比MD5慢60%。性能不是极为苛刻时,采用SHA-256或SHA-512相对于MD5与SHA-1会带来更好的稳定性与安全性。

  2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞,MD5已经被彻底攻破。王晓云教授和她的同事的思想是hashclash研究的基础。在快速碰撞发现方面,HASCLASH的第一个可交付性是MD5的快速碰撞生成算法。该方法发现没有任何特殊性质的碰撞。在选择前缀冲突方面,HASCLASH的第二个可交付性是为MD5构建选择的前缀冲突的方法。这意味着,对于任何有针对性的对不同消息M1和M2,可以有效地构建附属物B1和B2,使得MD5(M1*B1)等于MD5(M2×B2)。换言之,可以导致任何一对不同的IHVs的MD5碰撞。
   

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

 

①MD5算法中的选择前缀碰撞

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

②helloworld.exe和goodbyworld.exe两个可执行文件的MD5消息摘要值和两个文件的执行结果

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

GoodbyeWorld-colliding.exe

#include "stdafx.h"
int main(int argc, char* argv[])
{
    while(true)
        printf("Goodbye World :-(
");
    return 0;
}

  

  HelloWorld-colliding.exe

#include "stdafx.h"
int main(int argc, char* argv[])
{
    printf("Hello World ;-)
");
    return 0;
}

   通过对上方两个exe程序验证,md5 是一样的。

 ③可能出现的问题

不同软件或者执行文件的MD5可能是一样的,可以利用MD5的这个漏洞来伪造数字签名。
对MD5的冲撞攻击是比较容易的,普通的计算机可以在几小时甚至几分钟之内找到冲撞对。

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

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

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

原文地址:https://www.cnblogs.com/tingjuanli/p/9009328.html