1.MD5加密算法能被破解么?
MD5是散列加密算法,是不可以逆的,理论上是不能被真正破解的。如果突然有一天MD5算法能被破解了,
全宇宙最强的压缩算法就诞生了,任意字节数据都可以压缩到128bits。因此目前我们没办法把MD5字符串还原回对应的原文。
但可以通过诸多方法(例如,暴力破解、字典攻击和彩虹表攻击等)来破解MD5加密的数据。MD5的破解难度取决于多个因素,包括所需的计算资源和密码的复杂性,现有的技术和方法已经能够有效地破解MD5加密。
2.MD5破解的几种方法
目前所谓的“破解”指的就是“碰撞”。即找到一个原文,算出来的MD5码和已知的MD5码一样
。接下来介绍一些常见的破解方法。
2.1.穷举法&字典法
穷举法和字典法本质是一样的,都是利用计算机的资源尝试碰撞已知的MD5码。
穷举法非常简单,就是不停地尝试各种字符的排列组合,看哪一个组合的MD5码能对上
。缺点是太耗费时间了。
字典法把“
一个原文对应着一个MD5 码”
以映射表的形式存放起来,这样提供一个MD5码就有可能直接反查出原文。字典法体现了算法设计的“以空间换时间”的思想
。缺点是比较耗费空间。
因此,简单且常见的密码,如果用了 MD5 加密,会被暴力的很快。给大家推荐一个用字典法破解 MD5 的网站:https://www.cmd5.com/password.aspx
2.2.哈希链表&彩虹表法
如果穷举法太耗费时间,字典法太耗费存储空间的话,能不能考虑在时间消耗和空间消耗之间折中呢?我们可以考虑用链表将一系列有意义的原文和 MD5 码串起来。
要构造这样的链表,我们需要两个函数:哈希函数 H(x)和衰减函数R(x)。哈希函数可以是 MD5,也可以是其他的消息摘要算法。H(x) 的值域是 R(x) 的定义域,R(x) 的值域是 H(x)的定义域。「R(x)不是H(x)的反函数。」
将一个原文不停地使用 H(x) 和 R(x) 交替进行运算 k次,再将原文本身和运算结果以链表的形式串接起来,就可以得到结点个数为 2k+1 的链表。实际存放的时候只存放首端和末端两个原文即可。「这种链表叫做“哈希链表”,体现了算法设计的“时空权衡”(Space and Time Tradeoffs)。」
举个栗子,假设原文s=abcabc
,经过 2 次交替运算,得到以下的链表:
❝ abcabc->H(x)->3C8B0D7A->R(x)->eopmca->H(x)->7E9F216C->R(x)->rapper ❞
以上数据均为举例编造的,仅为说明原理使用。那我们存放这个链表的时候,只需要记录 abcabc 和 rapper 两个原文即可。
假设我们要破解的摘要值(哈希链表的 H(x) 不一定是 MD5 算法,这里用更准确的说法代替 MD5 码)是 7E9F216C,经过 R(x) 运算得到 rapper,说明我们要寻找的原文就在以 rapper 为末端的哈希链表中。从首端开始经过多次运算,我们发现 eopmca 的摘要值就是 7E9F216C。于是就反查出 7E9F216C 对应的原文是 eopmca。
「如果在生成哈希链表的时候依次使用多个不一样的 R(x),此时的哈希链表就是“彩虹表”。」
文字描述起来太过复杂,还是用图列举一个 demo。
彩虹表法
这里再给大家推荐一个已经计算好的彩虹表:http://project-rainbowcrack.com/table.htm
2.3.差分攻击
穷举法、字典法和彩虹表法都是暴力破解,适用于任何的消息摘要算法。
2004 年山东大学王小云
教授提出的 MD5 碰撞方法。她所用到的方法正是差分攻击。所谓的“破解”其实误导了很多人,并不是说扔给王小云一个MD5散列值,然后她马上就能算出一个原文来。实际上,王小云的研究成果如下:
MD5(M1)=MD5(M2)
即给定消息M1,能够计算获取M2,使得M2产生的散列值与M1产生的散列值相同。如此,MD5的抗碰撞性就已经不满足了,使得MD5不再是安全的散列算法。这样一来,MD5用于数字签名将存在严重问题,因为可以篡改原始消息,而生成相同的Hash值。
简单地用王教授的碰撞法给大家举个简单的例子:
- 用户A给B发文Hello;
- 通过王教授的碰撞法,得到Fuck这个字符串的摘要信息和Hello这个这个字符串产生的摘要信息是一样的;
- 如果B收到的是Fuck,经过MD5计算后的,B会误认为是A发来的就是Fuck,并没有被修改。
王小云院士的研究报告表明,MD4, MD5, HAVAL-128、RIPEMD和SHA-1均已被证实存在上面的漏洞,即给定消息M1,能够找到不同消息M2产生相同的散列值,即产生Hash碰撞。
2.4.哈希长度延展攻击的机制
哈希长度延展攻击利用的是哈希函数如MD5和SHA-1的特性。当计算哈希时,如果攻击者知道原始数据的哈希值但不知道原始数据内容,他们仍然可以在原始数据后添加一些数据,并且能计算出新数据串的哈希值,而不需要知道原始数据是什么。
3.如何加强散列算法的安全性?
由上可知,MD5 和 SHA-1都能被破解了,一般建议使用:SHA256及以上的散列加密算法。如果一定要使用,可以采用以下方式进行防御:
<1>如果内容和计算算法不要太简单,是没有办法被破解的。因此我们在进行设计时可以采用将数据复杂化的方式,来防止暴力破解。例如采用“数据+盐"的方式;
<2>可以采用多次MD5的方式来防止王小云院士提出的破解方案"MD5(MD5(数据+盐)+盐)"
,这样及时被替换为相同Hash值的内容,在后续计算中也能被发现。这个机制同样也能防御哈希长度延展攻击的机制。