文章目录

  • 1.什么是MD5?
  • 2.MD5真的安全么?
  • 3.MD5如何被破解?
  • 4.怎么防止MD5被破解?

1.什么是MD5?

  MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value)1,用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

2.MD5真的安全么?

  了解MD5的都知道,它是不可能逆的,即我们没办法把MD5码还原对应的原文。道理很简单,任意长度的数据经过MD5处理后,所包含的信息量已经大大减少。要是可以还原的话,那MD5岂不是成为压缩算法??所以这里就会给很多人造成误解,以为不可逆就是不可破解,的确,复杂些的密码在一些MD5在线破解网站是破解不了的,相对来说是安全的。可是,针对一个有安全隐患的问题来说,相对安全就是不安全。随着科学技术水平的提升,MD5已经越来越不安全了!!!正如其网站公告所说:2

3.MD5如何被破解?

  有很多种方法可以破解,不过需要明确一点,这里所谓的破解,并非把摘要还原成原文。为什么呢?因为固定128位的摘要是有穷的,而原文数量是无穷的,每一个摘要都可以由若干个原文通过Hash得到。

  对于MD5的破解,实际上都属于【碰撞】3。比如原文A通过MD5可以生成摘要M,我们并不需要把X还原成A,只需要找到原文B,生成同样的摘要M即可。

设MD5的哈希函数是H(X),那么:
H(A) = M
H(B) = M
任意一个B即为破解结果。
B有可能等于A,也可能不等于A。
用一个形象的说法,A和B的MD5结果“殊途同归”。

  MD5碰撞通常用于登陆密码的破解。应用系统的数据库中存储的用户密码通常都是原密码的MD5哈希值,每当用户登录时,验签过程如下:

  如果我们得到了用户ABC的密码哈希值E10ADC3949BA59ABBE56E057F20F883E,并不需要还原出原密码123456,只需要“碰撞”出另一个原文654321(只是举例)即可。登录时,完全可以使用654321作为登陆密码,欺骗过应用系统的验签。

4.怎么防止MD5被破解?

  看完第3点你就知道了,MD5不够安全,但是如果你对它一往情深,只想用MD5的话,不妨可以试下以下做法:

  • 多重加密
      所谓的多重加密,顾名思义,就是把你要加密的原文加密成MD5密文,然后再一次将MD5密文加密成MD5密文,多试几次,一般3次以后,在线破解网站就匹配不上了,但是,匹配不上就不代表足够安全喔,只是不容易被轻易破解(因为第二次要破解的原文是一个32位的数字字母的结合,以此类推),增加破解的时间成本而已!

  • 加盐加密
      比如Java中的Md5Crypt.apr1Crypt("要加密的密文","自定义盐值"),可以多重使用,自定掂量!

  • 使用复杂密码(包含数字英文小数点等)
      经过反复测试,使用复杂的密码也能降低被破解的风险,这也是现在很多软件系统都强制用户的密码不能低于16位数,且应包含数字英文小数点等的原因。

  • 不要在网站中显示密码列,哪怕是加密后回显的,也不可取!
      这一点很多初级开发者很容易犯错,在页面数据表格中绑定密码列给用户看,可能只是单纯的展示数据,却忽视了密码这一点容易被攻破的风险。比如下面这种情况,直接在表单回显密码,虽然是不可编辑和加密的状态,但是同样可以进行破解,这点你随便找个有经验的前端开发者应该都会。

谨记:(没有最好,只有更好)

  虽然MD5无法解密,但是可以碰撞出来,有库就行,对于单机来说,暴力枚举法的时间成本很高,字典法的空间成本很高。但是利用分布式计算和分布式存储,仍然可以有效破解MD5算法。因此这两种方法同样被黑客们广泛使用。


  1. 其实散列和Hash是一个东西(下文称Hash),只是一个中国名一个英文名。就是把任意长度的输入(又叫作预映射, pre-image),经过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间一般远小于输入的空间,不一样的输入可能会散列成相同的输出,因此不可能从散列值来惟一的肯定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 ↩︎

  2. 本站针对md5、sha1等全球通用公开的加密算法进行反向查询,通过穷举字符组合的方式,创建了明文密文对应查询数据库,创建的记录约90万亿条,占用硬盘超过500TB,查询成功率95%以上。 ↩︎

  3. MD5碰撞的方法有很多,主要包括暴力枚举法、字典法、彩虹表法等等。
    1.暴力枚举法:
      暴力枚举法顾名思义,就是简单粗暴地枚举出所有原文,并计算出它们的哈希值,看看哪个哈希值和给定的信息摘要一致。这种方法虽然简单,但是时间复杂度极高。想象一下,仅仅长度8位的密码就有多少种排列组合的可能性?只考虑大小写字母和数字,每一位有62种可能,那么8位密码的排列组合就是62的8次方,218340105584800,约等于二百万亿!是的,这样的数据量如果使用普通的单机来破解,恐怕头发白了也破解不完。不过,我们也可以做一些取巧,优先尝试生日和有意义的单词,这样就可以把穷举范围缩小很多。
    2.字典法:
      如果说暴力枚举法是ongoing时间换空间,那么字典法则是用空间换时间。黑客利用一个巨大的字典,存储尽可能多的原文和对应的哈希值。每次用给定的信息摘要查找字典,即可快速找到碰撞的结果。不过,这样做虽然每次破解速度很快,但是生成字典需要巨大的空间。仍然以8位密码举例,需要多大空间呢?刚才计算过有218340105584800种可能性,每一对映射占192(128+64)bit。那么大约需要4.65PB的存储空间。没错,这样做的存储成本实在太大了。当然,我们同样可以取巧,优先存储那些常用的密码及其摘要。那么,有没有什么方法可以做到时间和空间的均衡呢?有一种方法可以,那就是下面我要介绍的【彩虹表】。
    3.彩虹表法:
      彩虹表法可以说是对字典法的优化,它采用了一种有趣的数据结构:【彩虹表】。在学习彩虹表之前,我们先来了解两个基本函数:H(X)和R(X)。
    H(X):生成信息摘要的哈希函数,比如MD5,比如SHA256。
    R(X):从信息摘要转换成另一个字符串的衰减函数(Reduce)。其中R(X)的定义域是H(X)的值域,R(X)的值域是H(X)的定义域。但要注意的是,R(X)并非H(X)的反函数。
      通过交替运算H和R若干次,可以形成一个原文和哈希值的链条。假设原文是aaaaaa,哈希值长度32bit,那么哈希链表就是下面的样子:
      这个链条有多长呢?假设H(X)和R(X)的交替重复K次,那么链条长度就是2K+1。同时,我们只需把链表的首段和末端存入哈希表中:
      看到此,估计很多人就会有疑惑这什么跟什么啊,衰减函数和哈希链条,到底是干什么用的?别急,我们来演示一次破解过程,你就明白它们的意义了。给定信息摘要:920ECF10,接下来如何得到原文呢?只需进行R(X)运算:R(920ECF10)= kiebgt 查询哈希表可以找到末端kiebgt对应的首端是aaaaaa,因此摘要920ECF10的原文“极有可能”在aaaaaa到kiebgt的这个链条当中。
      接着从aaaaaa开始,重新交替运算R(X)与H(X),看一看摘要值920ECF10是否是其中一次H(X)的结果。从链条看来,答案是肯定的,因此920ECF10的原文就是920ECF10的前置节点sgfnyd。
      需要补充的是,如果给定的摘要值经过一次R(X)运算,结果在哈希表中找不到,可以继续交替H(X)R(X)直到第K次为止。
      简单来说,哈希链表代表了一组映射关系,其中每组包含K对映射,但只需要存储链条首位两个字符串。假设K=10,那么存储空间只有全量字典的十分之一,代价则是破解一个摘要的运算次数也提高了十倍。这就是时间和空间的取舍。虽然做了取舍,但是哈希链条存在一个致命的缺陷:R(X)函数的可靠性。虽然我们尽量把R(X)设计成结果均匀分布的函数,但是再完美的函数也难免会有碰撞的情况,比如这样:给定信息摘要:FB107E70,经过多次R(X),H(X)运算,得到结果kiebgt 通过哈希表查找末端kiebgt,可以找出首端aaaaaa,但是,FB107E70并不在aaaaaa到kiebgt的哈希链条当中,这就是R(X)的碰撞造成的。
      这个问题看似没什么影响,既然找不到就重新生成一组首尾映射即可。但是想象一下,当K值较大的时候,哈希链很长,一旦两条不同的哈希链在某个节点出现碰撞,后面所有的明文和哈希值全都变成了一模一样的值。
      这样造成的后果就是冗余存储。原本两条哈希链可以存储 2K个映射,由于重复,真正存储的映射数量不足2K。
      这个时候,我们设计了彩虹表。彩虹表对哈希链进行了改进,把原先的R(X)的函数改进成从R1(X)到Rk(X)一共K个衰减函数。这样一来虽然也可能发生碰撞,但是碰撞只会发生在同一级运算,如R1和R1碰撞,R3和R3碰撞,大大减小了存储重复的几率。
      相信看到这里,又有一部分人吐槽:啊,好复杂,看的头都晕了,如果想要破解MD5算法,有没有比彩虹表更厉害的方法呢?还真有。这里就不一一阐述了,感兴趣的小伙伴自行去了解哈~
    详情请参考我上一篇文章:
    通宵写6000字,浅谈密码的破解(破解HASH算法加密)
    密码的常见加密方式,你都了解多少? ↩︎

关于MD5的那点事,你都了解清楚了吗?相关推荐

  1. md5在线加密解密是不是什么都能解密?为什么我的没有解出来呢?

    网上有很多md5在线加解密站,熟悉网络安全或者IT技术的朋友可能会比较熟悉.MD5是一种加密技术方法.MD5的全称是Message-digest Algorithm 5,也称为信息摘要算法.主要是用于 ...

  2. 一切发生的事,都是好事(19年总结)

    一切发生的事,都是好事 引言 19年做的事: 20年目标 引言 曾仕强老先生曾说过,"一切发生的事,都是好事",人生漫漫,对一切事物都怀抱感激之意,谦虚之心,则战无不克,攻无不胜. ...

  3. 天下所有的事,都是为了利益,都是按利益逻辑规律在运行,发生的一切事情都可以用利益逻辑来解释。

    天下所有的事,都是为了利益,都是按利益逻辑规律在运行,发生的一切事情都可以用利益逻辑来解释. 为了利益合作结盟,为了利益竞争对亢,为了利益发动战争,为了利益两派竞选,为了利益屠裁统治,为了利益效仿陈胜 ...

  4. 牛X的事,都是在你一个人的时侯做出的 2012-03-07 22:02:22 文/刘小昭

    牛X的事,都是在你一个人的时侯做出的 2012-03-07 22:02:22 文/刘小昭一.当浮躁成为常态早上8点起床睁眼,拿起手机或ipad看看微博,查收和回复评论转发: 到公司,打开电脑,qq,m ...

  5. 注册公司成功后,这5件事你都做了吗?

    不想给别人打工想自己创业开公司,当然是个不错的想法.但如果你以为简化了商事登记流程,就能靠自己搞定公司注册?那你就错了,如果专业知识不过关,你就准备好在无数的"套路"中四处碰壁吧! ...

  6. 送书!1991-2018,区块链的那点事,都在这里了!

    导读:随着人工智能.区块链.大数据等新技术.新模式的深入蓬勃发展 , 数字经济已成为新时代发展的新引擎.新动能. 中关村数字媒体产业联盟主席.人民网原总裁何加正主席在<区块链+赋能数字经济> ...

  7. 关于MD5破解这件事

    blog.csdn.net/singlerace/article/details/1360400 前 几天在论坛上看到有人在讨论MD5的破解,很多人对MD5的理解让我大跌眼镜:有人认为MD5是一种加密 ...

  8. 关于电气工程及其自动化学科,国家电网的这些事你都知道吗?

    对电气工程及其自动化的认识 1.专业认识 1.电气工程及其自动化学科 电气工程及其自动化涉及电力电子技术,计算机技术,电机电器技术,信息与网络控制技术,机电一体化技术等诸多领域,是一门综合性较强的学科 ...

  9. python识图打怪_识别×图片、打飞机游戏,Python这些事你都知道吗?

    Python是挺神奇的. 可以做很多好玩的事情,今天就带大家看看,Python做的那些神奇好玩的事. 1.Python - Django 搭建简易博客 使用 Django 开发一个简单的博客 Web应 ...

  10. 什么是SEO网络推广,每天都需要做哪些事?

    什么是SEO网络推广?是很大一部分刚进入SEO行业的时候最头痛的事情,于是就会到淘宝去购买各种教程进行学习,在学习的途中发现购买的教程都是过时的了,于是问题就来了:什么是SEO网络推广,在了解什么是S ...

最新文章

  1. 拥抱单页网站! jQuery全屏滚动插件fullPage.js
  2. commons-lang包中我们常用的类的作用
  3. jsonp java后台_jsonp与Java后端
  4. 属于服务器操作系统的是,属于服务器操作系统的是
  5. Val编程-文本操作
  6. python猜数字1001untitled_ML - Python 基础
  7. pythonwebui自动化_python+selenium实现web端UI自动化测试
  8. 大数据好还是不好_学python好还是大数据好?想学IT,但有点搞不清方向的人可以看看...
  9. React 成为最吃香的前端技能,一纸技能图快速 Get!
  10. activemq网页管理端使用_iCloud大更新,移动端网页版推出 安卓也能使用
  11. 如何手动从Exchange2007/1010边缘/集线器传输服务器卸载ScanMail for Exchange(SMEX10.0)程序...
  12. java 快速创建map_快速创建Map并初始化,超级简单
  13. java安装没有jdk文件_java文件在没有安装jdk的windows下运行。
  14. 使用QT简单写一个串口助手
  15. 数据泵并行parallel参数问题
  16. 3种方法教你PS快速去掉水印
  17. 微信公众平台系列 一
  18. C语言数据结构——环形队列
  19. Android 文件中断续传
  20. 希尔顿旗下酒店于不同城市推出餐饮外卖、连住套餐、星厨上门、户外野餐等无忧安心产品...

热门文章

  1. 网线水晶头接法详细图文教程
  2. photo cs6 2018破解教程
  3. 【CSS应用篇】——CSS如何实现渐变背景
  4. Scheme 协议收集总结
  5. JavaScript高级学习(三)
  6. 网页版飞信(Fetion)的安全问题
  7. UIStoryBoard 中修改控件borderColor
  8. Ubuntu设置开机自动启动脚本/程序的各种方法
  9. 一步一步搭建前端监控系统:如何记录用户行为?
  10. sar adc的常用指标(一)