MD5安全性分析

MD5简介

关于MD5的一些基础特性就不多做介绍了,网上有太多的资料。

碰撞

提到MD5,或者任何一个Hash函数,不得不提的就是碰撞。

两个不同的输入M和M’,但其Hash值一样,我们就称之为碰撞。

本质上,对于任何一个哈希函数来说,碰撞是无可避免的,从一个规模较大的集合映射到一个规模较小的集合,必然会存在相同映射的情况。换句话说,如果有一种一一对应无碰撞的Hash函数,那么恭喜你,这是世界上最强大的压缩算法。

所以,对Hash函数而言,应该具有的特性是碰撞阻力,而并非避免碰撞。即,这个碰撞很困难,在实践过程中难以发生。

隐秘性

隐秘性指的是,找不到一种算法,能够由MD5值反推出输入M。换句话说,Hash函数是不可逆的。

谜题友好

谜题友好特性这个名字起的比较令人费解,但其实理解起来也比较容易,它指的是,在已知Hash值的情况下,想要知道输入M,除了反复尝试,没有更好的办法。这也就从另一个侧面上印证了Hash函数的隐秘性。

比特币的挖矿过程,本质也是利用了Hash函数的这一特性,在不断的尝试穷举,作为其工作量证明。

王小云碰撞算法及应用场景

王小云教授的成果集中在加速构造碰撞对。原来理论上构造出一个MD5碰撞对需要2^64次尝试,而现在只需要2^39次,其算法大大加速了这一过程。

但从应用场景上来看,它本身并不具备太多的应用价值,因为构造出的碰撞很可能毫无意义。它的价值在于,在此算法基础上衍生出来的一系列MD5的算法,能够在部分场景下,构造出一个有意义的伪造信息,并且MD5值保持不变。所以,单单看这个算法本身就说MD5不安全,有些夸大其实。但是,后续的那些算法出现之后,MD5的安全性就真的有些令人担忧了,也就是下文要说的两种算法。

长度拓展(Length Extension)攻击

这部分内容主要参考了阿里道哥的blog。文章里偏重公式和算法,但理解起来不算太困难。 
一句话解释长度拓展攻击,就是在已知输入M的长度(注意是长度)和其MD5值的情况下,可以在原文M后面附加任意内容,同时能够推算出新的MD5。在某些将MD5作为签名手段的系统中,攻击者可以在原文M后面随意添加内容同时能够提供正确的MD5值。

存在这一问题的原因是算法使用了Merkle–Damgård construction进行数据的压缩,不止MD5,很多流行的算法都存在这个问题,比如SHA1。

消息分组

MD5算法首先会将原始消息按512bit进行分组,那么最后一组很大概率是不到512bit的,这时候会对最后一组进行补齐,即补满512bit。这个过程称为padding。padding的规则是,在最末一个字节之后补充0x80,其余的部分填充为0x00,padding最后的8字节用来表示需要哈希的消息长度。

从这个规则里可以看出两点重要的性质:

  • 已知消息长度M,其padding的内容就是固定的. 这点比较好理解.
  • 长度一旦改变,padding内容就变了. 试想另一种补齐规则:所有字节全部补齐成0x00.那么显而易见,M和(M||0X00)在做完padding过程之后的数据完全一致.此时碰撞阻力就完全依赖于MD5算法的最后一步了.

消息压缩

在完成分组补齐操作之后,MD5算法开始对每组数据进行压缩.这个过程有个重要的特点:前一组的结果是后一组的输入.回到我们最开始的问题,已知消息M的长度和其MD5值,这里MD5值就是最后一组的输出,同时,它也可以作为下一组的输入.这就为我们在M后附加消息提供了便利:计算新的MD5值并不需要知道原始消息,只要知道MD5结果就可以了.

当然,MD5值并不能直接代入下一组直接进行计算,而是需要做一些新的运算还原成MD5算法中的中间结果.但不管怎样,这一过程是可行的.

特定前缀(Chosen Prefix)攻击

提高MD5安全性的手段

加盐

猜你喜欢

转载自blog.csdn.net/it_private/article/details/80728481
MD5