散列函数的应用及其安全性
一、散列函数的具体应用
(1)数字签名
哈希函数可以提高签名的速度,减少运算,又可以不泄露签名所对应的消息,还可以将消息的签名与加密变换分开处理。
(2)校验
可以校验数据是否被篡改。传输消息之前对消息进行哈希变换,接收者也进行相同的哈希变换,若两个哈希值相同,可以认为消息在传输过程中没有被篡改。
(3)快速访问
散列表的寻址时间复杂度为O(1),在数据存储中运用较多,这里不作详述。
(4)安全访问认证
MD5广泛用于操作系统的登陆认证上,如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。
(5)伪随机数生成
二、结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展。问题2的回答可以参考下面给出的第一个链接。
(1)散列函数的安全性
1、已知哈希函数的输出,要求它的输入是困难的,即已知c=Hash(m),求m是困难的。这表明函数应该具有单向性。
2、已知m,计算Hash(m)是容易的。这表明函数应该具有快速性。
3、已知,构造m2使Hash(m2)=c1是困难的。这表明函数应该具有抗碰撞性。
4、c=Hash(m),c的每一比特都与m的每一比特有关,并有高度敏感性。即每改变m的一比特,都将对c产生明显影响。这表明函数应该具有雪崩性。
5、作为一种数字签名,还要求哈希函数除了信息m自身之外,应该基于发信方的秘密信息对信息m进行确认。
6、接受的输入m数据没有长度限制;对输入任何长度的m数据能够生成该输入报文固定长度的输出。
(2)安全散列函数的发展
三种最广泛使用的算法是MD5,SHA和RIPEMD; 然而所有算法都来自MD4的格式。近些年,应用最广泛的散列函数是SHA。由于其他每一种被广泛应用的散列函数都已经被证实存在这密码分析学中的缺陷,接着到2005年,SHA或许仅存的安全散列算法。SHA由美国国家标准与技术研究院(NIST)开发。1995年公布SHA-1;2002年,公布了SHA-2(SHA-256、SHA-384、SHA-512);2008年,增加了SHA-224。
三、结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出现的问题。
(1)什么是md5算法中的选择前缀碰撞:
以同一个给定的前缀程序A为基础,在尾部添加不同的附加数据,得到两个具有相同MD5的样本B和C,前缀构造法碰撞后的两个样本只有尾部少量字节不同,而程序代码是相同的。通过判断尾部数据的差异,两个样本可以执行不同的程序流程。由于这种碰撞手法是通过同一前缀程序碰撞生成的两个样本,如果其中有恶意代码流程则两个样本均包含恶意代码,所以比较容易被安全软件识别,隐蔽性较差。
(2)可能出现的问题:
1、不同程序的MD5可能是一样的。比如说HelloWorld.exe和GoodbyeWorld.exe这两个程序,他们会在屏幕上打印出不同的字符,但是它们的MD5都是一致的。
2、容易对MD5进行冲撞攻击,普通的计算机可以在短时间内找到冲撞对。
3、可以利用MD5的这个漏洞来伪造数字签名
4、不能通过校验MD5从而确保软件安全性