MD5介绍以及如何破解MD5算法_md5解密算法-程序员宅基地

原文地址: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算法。因此这两种方法同样被黑客们广泛使用。
 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq805934132/article/details/88949559

智能推荐

命令注入绕过小结_php 命令 注入 绕过-程序员宅基地

文章浏览阅读944次。学到的东西,拎出来,总结总结,分享出来,才是完整的学习过程我觉得。一、命令注入官方的解释:即 Command Injection。是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。记得师傅用一句话概括注入的本质:就是把非法的输入当做代码来执行了。二、绕过.号被过滤,无法执行反弹目标机器的IP(例:192.168.1.1)时,将IP转成十进制进行绕过。(172...._php 命令 注入 绕过

job源码分析_new jobconf-程序员宅基地

文章浏览阅读1.4k次。/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * ..._new jobconf

PVE FRP MySQL 端口映射_frp pve-程序员宅基地

文章浏览阅读1.3k次。PVE FRP MySQL 端口映射前言虚拟软件(PVE,VMWare,Docker,VirtualBox)如果用有线连接除宿主机之外的主机均有可能连不上虚拟机里的MySQL,使用Wifi 就100% 能连上目前已知的解决办法是用frp 做虚拟机和宿主机的端口映射,然后其他机器访问宿主机服务端# 创建安装目录mkdir -p /opt/modules# 下载frpcd && wget https://github.com/fatedier/frp/releases/dow_frp pve

联合概率数据互联(JPDA) ----多假设跟踪(MHT)-程序员宅基地

文章浏览阅读3.8w次,点赞36次,收藏237次。联合概率数据关联(Joint Probabilistic Data Association,JPDA) 联合概率数据互联JPDA是数据关联算法之一,它的基本思想是:对应于观测数据落入跟踪门相交区域的情况,这些观测数据可能来源于多个目标。JPDA的目的在于计算观测数据与每一个目标之间的关联概率,且认为所有的有效回波都可能源于每个特定目标,只是它们源于不同目标的概率不同。JPDA算法的..._多假设跟踪

ARKit从入门到精通(1)-ARKit初体验-程序员宅基地

文章浏览阅读10w+次,点赞59次,收藏161次。ARKit从入门到精通(1)-ARKit初体验转载请标注出处:http://blog.csdn.net/u013263917/article/details/72903174,以及版权归属黑马程序员:http://www.itheima.com1.1-AR技术简介增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技_arkit

git查看commit历史,某次commit修改内容,指定文件修改历史_如何查看历史commi的修改信息-程序员宅基地

文章浏览阅读7.2k次。git log 查看commit的历史 git show 查看某次commit的修改内容 git log -p 查看某个文件的修改历史 git log -p -2查看最近2次的更新内容_如何查看历史commi的修改信息

随便推点

Python 复合语句-程序员宅基地

文章浏览阅读886次,点赞15次,收藏26次。匹配语句逻辑流程的概述如下:对目标表达式求值后将结果作为匹配用的目标值。如果目标表达式包含逗号,则使用构建一个元组。目标值将依次与case_block中的每个模式进行匹配。匹配成功或失败的具体规则在下面描述。匹配尝试也可以与模式中的一些或所有的独立名称绑定。准确的模式绑定规则因模式类型而异,具体规定见下文。成功的模式匹配过程中产生的名称绑定将超越所执行的块的范围,可以在匹配语句之后使用。备注在模式匹配失败时,一些子模式可能会成功。不要依赖于失败匹配进行的绑定。

APP兼容性测试_为什么app要测兼容性-程序员宅基地

文章浏览阅读1.1k次。主要测试内部和外部兼容性1)与本地及主流App是否兼容2)与各种设备是否兼容,若有跨系统支持则需要检验是否在个系统下,各种行为是否一致。不同手机屏幕分标率的兼容性不同手机品牌的兼容性..._为什么app要测兼容性

关于串行通信、通信接口、接口连接器、通信协议的理解_通讯器,连接器,串口器的区别-程序员宅基地

文章浏览阅读3.8k次,点赞2次,收藏4次。串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。通信接口是指中央处理器和标准通信子系统之间的接口。(是否可以理解为对电气特性的定义?)串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流_通讯器,连接器,串口器的区别

Android面试题精选——再聊Android-Handler机制-2(1),一次关于JVM的面试经历-程序员宅基地

文章浏览阅读583次,点赞29次,收藏25次。写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的。

设计模式中工厂方法与抽象工厂之间的区别联系-程序员宅基地

文章浏览阅读379次,点赞5次,收藏5次。无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》

自己写一个Map (实现Map接口并利用散列原理)-程序员宅基地

文章浏览阅读1.8k次。1.EntryMap是java中的接口,Map.Entry是Map的一个内部接口。Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V&g..._自己写一个map