一、散列函数的具体应用
1)文件校验
我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
2)数字签名
Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
3)鉴权协议
如下的鉴权协议又被称作”挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。
二、说明散列函数的安全性以及目前安全散列函数的发展。
1)生日攻击
生日攻击是指在N个人中出现生日相同的概率,通常我们本能的反应是366个人中就一定会有相同生日,但实际上通过概率的运算,只需要70个人,出现相同生日的概率就高达99.9%。而70大概只是366的五分之一。
防范方法:
(1)使用安全的Hash算法:安全的Hash算法生成的Hash值有足够多的位数。这样,攻击者在寻找两个具有相同Hash值的文件时就会非常困难。
(2)加盐:在为文件签名之前,先向文件添加一个随机值,然后计算Hash值,再将文件、签名和随机值一起发送给接收者。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。
(3)改动文件:在为文件签名之前,对消息或文件做少许改动。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。
2)MD5安全性:
MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好,是计算机安全领域广泛使用的一种散列函数。
但是在2004年8月17日的美国加州圣巴巴拉,正在召开的国际密码学会议上,王晓云教授首次公布了提出一种寻找MD5碰撞的新方法,目前利用该方法用普通微机几分钟内即可找到MD5的碰撞,MD5已经被彻底攻破。她的研究成果作为密码学领域的重大发现宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。
3) SHA-1的安全性:
安全哈希算法SHA-1是在1993年提出并在1995年完成修订,如今已经在许多加密安全协议中广泛使用,包括TLS和SSL、PGP 、SSH、S/MIME和IPsec等,被视为是MD5(散列函数)的后继者。然而从2005年开始,SHA-1的安全性就开始被密码学家质疑,他们认为随着计算机性能的提升,破解SHA-1算法将不成问题。2017年2月23日Google实现了对SHA-1算法的第一次攻击,现SHA-1算法被破解已经成为现实。
三、md5算法在验证软件完整性时可能出现的问题。
1)数据完整性校验
检查数据有没有被篡改过,这里取个例子。当用Android手机进行OTA升级的时候,下载完升级包(不管是全升包还是增量包),紧接着就是用该升级包的标准MD5进行验证,如果校验的结果等于标准的MD5值,那么就证明这个升级包没有被篡改过。
2)不可逆的加密
像Unix系统中,用户用用户名和密码登陆系统,由于系统中存放的是用户名和密码组合MD5校验值,所以登陆框将会把用户名和密码进行MD5算法从而生成用户名和密码组合的MD5校验值,系统由此可以知道能不能登陆成功。
MD5算法解析
MD5是以512位做为一个单位来处理原文,每一个512位又被分成16*32位来进行处理,直到所有原文都被处理一遍。
1、首先要对原文进行填充,保证数据长度是512个位的整数倍,填充方式如下:
(原文+ n + 64) %512 = 0
n:表示需要在原文后面添加多少位,一般添加1个1,或n和0
64:表示原文的长度
2、MD5算法中,需要初始链接变量,作为算法第一轮运算的基础,它作为MD5算法的初始值,可以想象,就算是同一段原文在进行MD5生成时,只要链接变量不一样,生成的MD5校验值也是不一样的。
针对这512位为一个分组的数据,处理方式是将它分成16*32位。从程序上来看,主循环有4轮,每一轮对这个16个数字进行处理,这里需要提到4个函数,每一次的处理都是通过这4个函数来完成的。当经过这些循环之后,会生成一个32位的MD5目标校验值。如果采用相同的初始链接变量和4个函数,那么对于同一段原文生成的MD5目标校验值是一样的,所以,MD5就能去检测数据的完整性和一致性。