[安全开发]MD5加密算法能被破解么?

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值的内容,在后续计算中也能被发现。这个机制同样也能防御哈希长度延展攻击的机制。

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷咪哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值