文章目录
零、前言
一、MD5 概述
1、什么是 MD5 ?
MD5,讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash value),用于确保信息传输完整一致。
2、MD5的特性
-
长度固定
无论输入多少,输入固定为 16 字节 ,相当于超损压缩。 -
不可逆
无法从结果反推原始数据。由于长度固定的特性,中间会丢掉一些信息。因此,相同数据的MD5值肯一样,不同数据的MD5值几乎不可能一样。
MD5 是摘要算法,由MD5产生的编码之于正文,正如指纹之于人一样,只要正文不变,那么摘要就不变。
因为MD5是有限多个的而原文可以是无数多个。因此,一个MD5理论上可能对应无数多个原文的。主流的MD5将 任意长度 的字节串 映射 为一个 128bit 的 大整数 ,一共有 2128 种可能,尽管这个数字是有限多个的,但是世界上可以被用来加密的原文却有无数的可能性。这就好比,只知道指纹与人的关系。 -
高度离散型 (抗修改性)
输出的16个字节,没有规律可言,因此结果也无法预测。同时,对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。 -
抗碰撞性
想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。同样地,已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
二、MD5 算法原理
MD5算法的原理是 将输入的消息分成 512位 的 数据块 ,每个数据块 再分成 16 个 32位 的 小块,通过一系列的 位运算 和 非线性函数 ,对 每个小块 进行 处理 ,最终得到 一个 128位 的 哈希值。由于MD5算法的设计,即使输入的消息只有微小的变化,也会导致 输出的哈希值 发生巨大的变化,因此可以用来 验证 数据的完整性 和 真实性。
1、数据填充
数据填充,即进行 补位
操作
- 目的:对消息进行数据填充,使得 长度 变成 N*512 + 448 该步骤必须进行
- 方法:先补一个 1 再补上 多个 0 ,使得总长度 除于 512 的余数 为 448
2、添加消息长度
- 目的:使得最终消息长度就是512的整数倍。使得消息长度变成 (N+1)*512
- 方法:在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于264,则只使用其低64位的值,即(消息长度 对 264取模)。
- 注意:哪怕 MD5 消息已经是正确的长度,也必须填充MD5消息长度。
3、初始化MD缓存器
MD5运算要用到一个128位的MD5缓存器,用来保存中间变量和最终结果。
该缓存器又可看成是4个32位的寄存器A、B、C、D,
初始化为 :
A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
4、处理数据段
- 定义4个非线性函数F、G、H、I,对输入的报文运算以512位数据段为单位进行处理。
- 对每个数据段都要进行4轮的逻辑处理,在4轮中分别使用4个不同的函数F、G、H、I。
- 每一轮以ABCD和当前的512位的块为输入,处理后送入ABCD(128位
三、MD5 的 用途
1、密码存储
常见的MD5 密码存储方式:
-
使用哈希存储密码;
-
使用哈希加盐存储密码;
-
使用加密算法存储密码;
-
使用 bcrypt 存储密码;
曾经 MD5 被用于存储加密信息,但现逐步被替代 。正如它的特性—— 摘要算法,而非加密算法。本质上,可以看作是哈希函数(将无限键值空间中的所有键都均匀地映射到一个指定大小的键值空间中)。
需要明确,好的 摘要算法 能够帮助我们保证文件的完整性,避免攻击者的恶意篡改,但是 加密算法 —— 通过某种特定的方式来编码消息或者信息,只有授权方可以访问原始数据,而没有被授权的人无法从密文中获取原文。
因此,MD5 更多用在检验,而非保密。例如,上传大文件到某云盘时,会发现该文件瞬间就上传成功了,但真的是这样吗?其实是云盘将该文件的MD5 上传后与 已有的 文件形成对比,如果有相同的编码,则用已经上传成功的文件替代。
2、数字签名
MD5 将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的 MD5 信息摘要。需要注意,这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。
3、文件完整性校验
MD5 将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的 MD5 信息摘要;
4、垃圾邮件筛选
四、常见面试题
1、存储MD5的值应该用 varchar 还是 char ?
2、MD5属于哪种加密算法?
3、MD5、AES、RSA三者有什么区别?