原文地址:https://blog.csdn.net/wufaliang003/article/details/79794982

https://www.cnblogs.com/xzwblog/p/6958056.html

详细可参考原文。

-------------------------------------------------------------------------------------------------------

MD5

  全称是Message-Digest Algorithm 5(信息-摘要算法5),理论上是一种单向的哈希散列,

特性:

  • 输入任意长度的信息,经过处理,输出为128位的大整数(数字指纹)(32位16进制数);
  • 不同的输入一般得到不同的结果(唯一性);
  • 根据128位的输出结果不可能反推出输入的信息(不可逆);
  • 强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

MD5用途:

1、防止被篡改:
  1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。
  2)比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。
  3)SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

2、防止直接看到明文:
  现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码(其实这样是不安全的,后面我会提到)。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。)

3、防止抵赖(数字签名):
  这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

MD5算法过程:

  对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。基本操作,求余、取余、调整长度、与链接变量进行循环运算。
第一步、填充:如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);

第二步、记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N512+448+64=(N+1)512位。

** 第三步、装入标准的幻数(四个整数):**标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。

第四步、四轮循环运算:循环的次数是分组的个数(N+1)

MD5安全性:

  普遍认为MD5是很安全,因为暴力破解的时间是一般人无法接受的。实际上如果把用户的密码MD5处理后再存储到数据库,是很不安全的。因为用户的密码是比较短的,而且很多用户的密码都使用生日,手机号码,身份证号码,电话号码等等。或者使用常用的一些吉利的数字,或者某个英文单词。如果我把常用的密码先MD5处理,把数据存储起来,然后再跟你的MD5结果匹配,这时我就有可能得到明文。比如某个MD5破解网站http://www.cmd5.com/default.aspx ,把其网站下的公告复制如下:
  md5破解、动网论坛密码破解等不再需要用穷举法,本站共有md5记录235亿条,还在不断增长中,已包含10位及10位以下数字、7位字母、部分7位字母+数字,全部6位及以下字母加数字等组合,并针对国内用户做了大量优化,例如已经包含所有手机号码、全国部分大中城市固定电话号码、百家姓、常用拼音等大量组合,另加入了某大型网站真实会员密码数据10万条。本站数据量大,查询速度快,同时支持16位及32位密码查询。通过对10万会员的真实动网论坛样本数据的测试,本站对于动网论坛密码的命中率达到83%。

-------------------------------------------------------------------------------------------------------

小明:老师,上次您讲了MD5算法。用它生成的信息摘要,真的可以被破解吗?

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

小明:如果是这样的话,网上所说的MD5破解到底是怎么回事呢?

老师:对于MD5的破解,实际上都属于【碰撞】。比如原文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作为登陆密码,欺骗过应用系统的验签。

小明:那么,具体如何来实现MD5摘要的碰撞呢?

老师:MD5碰撞的方法有很多,主要包括暴力枚举法、字典法、彩虹表法等等。

暴力枚举法:

老师:暴力枚举法顾名思义,就是简单粗暴地枚举出所有原文,并计算出它们的哈希值,看看哪个哈希值和给定的信息摘要一致。这种方法虽然简单,但是时间复杂度极高。想象一下,仅仅长度8位的密码就有多少种排列组合的可能性?

小明:只考虑大小写字母和数字,每一位有62种可能,那么8位密码的排列组合就是62的8次方,218340105584800,约等于二百万亿!

老师:是的,这样的数据量如果使用普通的单机来破解,恐怕头发白了也破解不完。不过,我们也可以做一些取巧,优先尝试生日和有意义的单词,这样就可以把穷举范围缩小很多。

字典法:

老师:如果说暴力枚举法是ongoing时间换空间,那么字典法则是用空间换时间。黑客利用一个巨大的字典,存储尽可能多的原文和对应的哈希值。每次用给定的信息摘要查找字典,即可快速找到碰撞的结果。

不过,这样做虽然每次破解速度很快,但是生成字典需要巨大的空间。仍然以8位密码举例,需要多大空间呢?

小明:刚才计算过有218340105584800种可能性,每一对映射占192(128+64)bit。那么大约需要4.65PB的存储空间。

老师:没错,这样做的存储成本实在太大了。当然,我们同样可以取巧,优先存储那些常用的密码及其摘要。

小明:那么,有没有什么方法可以做到时间和空间的均衡呢?

老师:有一种方法可以,那就是下面我要介绍的【彩虹表发】。

彩虹表法:

老师:彩虹表法可以说是对字典法的优化,它采用了一种有趣的数据结构:【彩虹表】。在学习彩虹表之前,我们先来了解两个基本函数: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算法,有没有比彩虹表更厉害的方法呢?

老师:还真有。

2004年,王小云教授提出了非常高效的MD5碰撞方法。

2009年,冯登国、谢涛利用差分攻击,将MD5的碰撞算法复杂度进一步降低。

有兴趣的小伙伴可以通过资料进行更深入的学习。

几点补充:

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

MD5介绍以及如何破解MD5算法相关推荐

  1. 漫画:如何破解MD5算法

    转载自 玻璃猫 程序员小灰 在之前的漫画中,我们介绍了MD5算法的基本概念和底层原理,没看过的小伙伴们可以点击下面的链接:<漫画:什么是MD5算法?> 这一次,我们来讲解如何破解MD5算法 ...

  2. 漫画:如何破解MD5算法?

    来自:梦见(微信号:dreamsee321) 在之前的漫画中,我们介绍了MD5算法的基本概念和底层原理,没看过的小伙伴们可以点击下面的链接: 漫画:什么是MD5算法? 这一次,我们来讲解如何破解MD5 ...

  3. 优秀的 Verilog/FPGA开源项目介绍(三十零)- 暴力破解MD5

    MD5原理 在密码领域,美国一直在向全世界推广MD5密码,还多次声称:没人能破解我们的MD5密码,就连著名的密码学家Biham,也把破解MD5密码作为一生的梦想.(这是多年前的言论.不要过度解读,做个 ...

  4. MD5 加密已被破解

    密码学领域重大发现:山东大学王小云教授成功破解MD5 2004-09-04 09:39 [本站讯]2004年8月17日的美国加州圣巴巴拉,正在召开的国际密码学会议(Crypto'2004)安排了三场关 ...

  5. 密码学领域重大发现:山东大学王小云教授成功破解MD5

    密码学领域重大发现:山东大学王小云教授成功破解MD5 [日期:2004-09-05] 来源:山东大学 作者: [字体:大中小] 转自山东大学 [本站讯]2004年8月17日的美国加州圣巴巴拉,正在召开 ...

  6. MD5介绍及Windows下对文件做md5校验。

    MD5介绍参考百度百科: 摘要如下: MD5 校验和(checksum)通过对接收的传输数据执行散列运算来检查数据的正确性. 一个散列函数,比如 MD5,是一个将任意长度的数据字符串转化成短的固定长度 ...

  7. MD5和SHA-1被破解(计算机世界报)

    Org published: 2013-03-12 14:59:46 如果说MD5和SHA-1是当今各种信息安全体系所依赖的大厦基石,那么现在,这些大厦的基础已经出现了很大的裂缝,甚至,有崩塌的危险. ...

  8. 分享几个好用的在线破解md5的网站

    分享几个好用的在线破解md5的网站 分享国内常用的几个免费MD5在线解密网站,一个不行就试试下一个: 1. cmd5 链接:https://www.cmd5.com/ 2. somd5 链接:http ...

  9. java 生成md5 8位_Java生成MD5算法

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),是一种用于产生数字签名的单项散列算法. MD5算法的作用是让大容量信息在用数字签名软件签私人密匙前被"压缩& ...

  10. android MD5校验码的生成与算法实现

    android MD5校验码的生成与算法实现 在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD ...

最新文章

  1. ubuntu下shutter的用法
  2. kylin3.x安装,解决load hive表的时候提示shaded-guava问题
  3. app显示服务器借口错误,hbuider 运行 uni-app 电脑端安卓模拟器接口请求错误
  4. JavaFX 2.0布局窗格– HBox和VBox
  5. Java中的关键字this_super
  6. 图Graph--拓扑排序(Topological Sorting)
  7. Hibernate框架 简述
  8. 搜索提示的实现(仿百度):附源码和在线demo
  9. Rust导出Python/Node.js可用的DLL库
  10. (转载)高速ADC的关键指标:量化误差、offset/gain error、DNL、INL、ENOB、分辨率、RMS、SFDR、THD、SINAD、dBFS、TWO-TONE IMD...
  11. 【转载】 乙女游戏汇总
  12. 微信支付【 wx.chooseWXPay、WeixinJSBridge.invoke】
  13. 清除阿里云服务器挖矿程序过程
  14. uniapp一套代码开发app和微信小程序
  15. Windows上使用VLC插件的方式在IE浏览器上播放RTSP视频流
  16. windows10 javac错误:javac不是内部或外部命令 也不是可运行的程序
  17. [嵌入式框架][nrf51822][SDK12.3] BLE分层设计 NUS 透传数据队列发送,提升带宽利用率
  18. oracle 与赛门铁克,Oracle与赛门铁克认证Veritas数据中心解决方案
  19. java 对Outlook保存的.Msg格式文件解析
  20. 12步轻松搞定 Python 装饰器

热门文章

  1. 【模块学习】关于磁力计HMC5883L型号探索
  2. IE无法打开internet网站已终止操作的解决的方法
  3. VOCALOID Job Plugin API 任务插件开发参考手册中文翻译 V1.0
  4. 基于BS架构的微博系统
  5. 基于SSM实现微博系统
  6. android4.4.3版本root,碉堡了!ROOT精灵支持Nexus 5等Android4.4.3机型ROOT
  7. 使用adb命令安装apk
  8. Dukto 文件传输软件(推荐)
  9. recv( )函数返回值说明
  10. html5 统计图 等值线,浅谈WebGIS等值线模态前端展示生成绘制(算法经验)