MD5算法简要解析及扩展
1. MD5 简要解析
1.1 MD5是什么
全称:message-digest algorithm 5(信息-摘要算法)
例如:在下载一下东西时,经常在一些压缩包属性里,看到md5值。而且这个下载页面,很可能会在某一个地方,写了一句,此文件的MD5值为XXXXXXXXX。这有什么作用呢?
- MD5:其实就是一种算法。可以对一个字符串,或文件,或压缩包等数据进行处理,执行md5后,就可以生成一个固定长度为128bit的字符串,这个字符串,基本上是唯一的
- 所以,有人修过压缩包后,就会生成新的字符串,这时就可以拿网站提供的字符串和新生成的字符串对比,如果不同,那就是被人修过
1.2 加密和摘要
- 加密后的消息是完整的;具有解密算法,可以得到原始数据;
- 摘要得到的消息是不完整的;通过摘要的数据,不能得到原始数据;
1.2.1 摘要算法
- 摘要算法又称哈希算法、散列算法
- 它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)
- 通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过
- 摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难;而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同
摘要算法 主要有 SHA-1、MD5 等
1.2.2 加密算法
- 在于别人无法成功查看加密后的数据,并且在需要的时候还可以对数据进行解密来重新查看数据
- 而 MD5 算法是一种哈希算法,哈希算法的设计目标本身就决定了,它在大多数时候都是不可逆的,即你经过哈希算法得出的数据,无法再经过任何算法还原回去
- 所以,既然不能将数据还原,也就不能称之为可以解密;既然不能解密,那么哈希的过程自然也就不能称作是「加密」
1.3 MD5长度
- 默认为128bit,也就是128个0和1的二进制串
- 由于128个0和1表示太不友好,所以将二进制转成了16进制,每4个bit表示一个16进制,128/4 = 32 换成16进制表示后,为32位
网上有很多帖子,问MD5 32位 16位 加密 区别?
仔细观察admin生成的32位和16位的md5值……
查询结果:
md5(admin,32) = 21232f297a57a5a743894a0e4a801fc3
md5(admin,16) = 7a57a5a743894a0e
其实16位的长度,是从32位md5值来的。是将32位md5去掉前八位,去掉后八位得到的。
1.4 MD5的作用
-
一致性检验,最上面那个例子(修改压缩文件的例子)
-
举个例子,你写了一篇文章,内容是一个字符串 ‘hello world’,
并附上这篇文章的摘要是 ‘2d73d4f15c0db7f5ecb321b6a65e5d6d’ ;如果有人篡改了你的文章,并发表为 ‘hello China’ ,你可以一下子指出其篡改了你的文章,因为根据 ‘hello China’ 计算出的摘要不同于原始文章的摘要
-
-
数字签名,还是最上面那个例子;只是把MD5看成一个指纹,按了个手印说明独一无二
-
安全访问认证,这个就是平时系统设计的问题
-
在用户注册时,会将密码进行MD5算法处理,存到数据库中;这样可以防止那些可以看到数据库数据的人,恶意操作
1.5 MD5不能破解吗?
- MD5是不可逆的,没有对应的算法,无法从生产的MD5值逆向得到原始数据
- 但是有很多种方法可以破解,不过需要明确一点,这里所谓的破解,并非把摘要还原成原文。为什么呢?因为固定128位的摘要是有穷的,而原文数量是无穷的,每一个摘要都可以由若干个原文通过Hash得到
- 对于MD5的破解,实际上都属于"碰撞";比如原文A通过MD5可以生成摘要M,我们并不需要把X还原成A,只需要找到原文B,生成同样的摘要M即可
主要包括暴力枚举法、字典法、彩虹表法等
- 暴力枚举法:顾名思义,就是简单粗暴地枚举出所有原文,并计算出它们的哈希值,看看哪个哈希值和给定的信息摘要一致。这种方法虽然简单,但是时间复杂度极高
- 字典法:利用一个巨大的字典,存储尽可能多的原文和对应的哈希值。每次用给定的信息摘要查找字典,即可快速找到碰撞的结果。这样做虽然每次破解速度很快,但是生成字典需要巨大的空间,大约需要4.65PB的存储空间
- 对于彩虹表法这个理解起来就比较复杂
1.6 MD5是唯一的吗?
MD5作为数据库中的主键可行吗?这就涉及到一个问题,md5值是唯一的吗?
- 不唯一
- 一个原始数据,只对应一个MD5值;
- 但是一个MD5值,可能对应多个原始数据
2. 加密算法扩展
2.1 加密和解密
2.1.1 加密
- 数据加密 的基本过程,就是对原来为明文 的文件或数据按 某种算法 进行处理,使其成为不可读 的一段代码,通常称为“密文”;
- 通过这样的途径,来达到 保护数据 不被 非法人窃取、阅读的目的
2.1.2 解密
加密 的 逆过程 为解密,即将该 编码信息 转化为其 原来数据 的过程。
2.2 对称加密和非对称加密
加密算法分 对称加密 和 非对称加密
- 对称加密算法的加密与解密密钥相同
- 非对称加密算法的加密密钥与解密 密钥不同
- 常见的 对称加密 算法主要有
DES、3DES、AES等 - 常见的 非对称算法 主要有
RSA、DSA等
2.2.1 对称加密算法
对称加密算法 是应用较早的加密算法,又称为共享密钥加密算法。
- 在 对称加密算法 中,使用的密钥只有一个,发送 和 接收 双方都使用这个密钥对数据进行 加密 和 解密
- 这就要求加密和解密方事先都必须知道加密的密钥
分析:
- 数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和 加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文进行发送
- 数据解密过程:数据接收方 收到密文后,若想读取原数据,则需要使用 加密使用的密钥及相同算法的 逆算法 对加密的密文进行解密,才能使其恢复成 可读明文
2.2.2 非对称加密算法
非对称加密算法,又称为公开密钥加密算法。
- 它需要两个密钥,一个称为公开密钥 (public key),即 公钥,另一个称为 私有密钥(private key),即 私钥
- 因为 加密 和 解密使用的是两个不同的密钥,所以这种算法称为 非对称加密算法
分析:
- 如果使用 公钥对数据 进行加密,只有用对应的 私钥 才能 进行解密
- 如果使用 私钥对数据 进行加密,只有用对应的 公钥 才能 进行解密


