1、散列函数的具体应用
Hash算法在信息安全方面的应用主要体现在以下的5个方面:
(1)消息认证
可以用来验证信息的来源是真实的,而不是伪造的,此为消息源认证。也可以验证消息的完整性,即验证信息在传送或存储过程中是否被篡改。
(2)数字签名
Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
(3)口令的安全性
(4)文件的完整性
譬如可信计算、文件病毒的检验、网页防篡改、黑白名单等许多应用。
(5)密码协议的应用
譬如零知识证明、比特承诺、投掷硬币、电子商务的安全协议等许多应用。
2、散列函数的安全性以及目前安全散列函数的发展
hash函数安全要满足三条性质:
1.单向性(原像稳固性):给定一个消息摘要y,很难找到符合h(x)=y的消息x。
2.第二原像稳固性:给定x,很难找到一个x’,满足h(x)=h(x’)。
3.碰撞稳固性:很难找到满足h(x)=h(x’)的二元组(x,x’)。
这其中解决第三个问题碰撞问题的难度是最小的,目前对md5、sha1的攻击也已经成功。
生日悖论:
如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。对于60人以上,这种概率要大于99%。
散列算法都是把数量为无限的数据、字符串、文件映射成有限长的hash,因此这个映射一定不是单射,这样的hash函数肯定存在两个数据M1,M2,使得HASH(M1) = HASH(M2)。根据生日悖论,如果哈希值的位数过短,很容易可以找到一组(两个)哈希值相同的输入,这就是一种最常用的生日攻击的应用。
主动碰撞:
王小云实现MD5碰撞:根据MD5这种Hash算法的特点,他们是任意长度的字符串变成固定长度的摘要信息,所以就有可能发生一个问题:不同的字符串在理论上是有可能产生相同的摘要信息。
王小云所谓的碰撞法,碰撞的就是不同的字符串所产生的摘要信息是一样的那些字符串。王教授证明了MD5等Hash算法产生的摘要信息规则是可以在比较短时间内被破解的。
2017年google宣布实现SHA-1碰撞:在实际中,可以构造两个SHA-1结果相同的PDF文件。这使得第二个文件SHA-1后的数字签名可以通过第一个文件SHA-1后数字签名的验证。
安全散列函数的发展:
1、MD4
1990年Ronald L. Rivest设计,通过三圈的操作将任意长度的消息变换成128位的哈希值
2、MD5
Rivest于1991年对MD4的改进版本。运用了四轮变换,并且每轮加上前一轮的结果
3、HAVAL
为MD5的改进版本。轮数可以为3、4或5,输出长度分别为128、160、192或224位
4、SHA-1
由NIST开发,1993年发表。输入最大长度为2^64位的数据,输出160位的消息摘要
5、SHA-256
输出由160位扩大到256位,迭代次数由80次增加到128次
6、SHA-384
输出扩大到384位,迭代次数增加到192次
7、SHA-512
输出扩大到512位,迭代次数增加到256次
3、MD5算法验证软件完整性时可能出现的问题
MD5算法是一种摘要算法,它可以从多个字节组成的串中计算出由32个字节构成的“特征串”。对于超过32字节的串来说,MD5计算得出的值必然是其一个子集,所以必然存在两个(或更多)不同的串能够得出相同MD5值的情况,这种情况就叫做MD5碰撞。
几位密码学家使用 “构造前缀碰撞法”(chosen-prefix collisions)来进行攻击(是王小云所使用的攻击方法的改进版本),他们所使用的计算机是一台Sony PS3,且仅用了不到两天。如果仅仅是想要生成MD5 相同而内容不同的文件的话,在任何主流配置的电脑上用几秒钟就可以完成。
他们的结论:MD5 算法不应再被用于任何软件完整性检查或代码签名的用途。
不仅仅是老师给出链接中的例子,这两张截然不同的图片却有相同的MD5:
MD5算法验证软件完整性时可能出现的问题:
1、文件篡改
2、木马病毒植入
3、传输错误、中断