type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Oct 28, 2023 10:42 AM
Parent item
领域
MD5的全称是Message Digest #5,表示消息摘要算法的第5个版本。MD5是MIT教授Rivest于1991年设计的一种Hash算法。MD5算法对于一段任意长度的消息,都能够输出一个128位长度的Hash值。这里的任意长度是指只要是大于1位的数据即可。
数字 1 的MD5 hash值是
C4CA4238A0B923820DCC509A6F75849B
算法实现
对MD5算法的实现过程可以概括为3个步骤:
- 对输入的信息以512位为单位进行分组,如果最后不足512位,根据算法进行填充补位,每一分组又被划分为16个32位子分组;
- 对每个子分组经过了一系列的处理后,算法的输出一个由4个32位分组组成的结果;
- 将这四个32位分组结果组合拼接后将生成一个128位散列值;
算法详细过程如下:
- 第一步,定义初始化变量及函数。算法需要用到的4个初始化变量是:
注意:上述的定义是数值在内存中的存储顺序,如果存储方式为大端字节序,那么变量中定义的顺序不需要变;如果存储方式为小端字节序,为了保证A、B、C、D 4个值在内存中的显示情况为上面情况,需要调整数字的位置为:
算法需要用到3个初始化变量数组,分别为是T、s、m,定义如下:
算法需要用到的基础函数定义如下:
其中:&表示与, |表示或,~表示非,^表示异或,<<<表示循环左移。
- 第二步,对消息进行填充补位。
- 如果Result 等于448位 ,那么不需要进行补位处理。
- 如果Result 不等于448位,就需要填充一定的数据进行补齐,使得对512求余的结果Result等于448位。填充的方法是填充一个1和n个0。填充完后信息的长度就为
(M/512)*512+448(位)
;
对输入消息的长度(bit)进行512位长度求余:
Result = M mod 512bit
。对于求余的结果Result的处理,有下面2种情况:经过处理后的输入消息求余后的Result等于448位,在该消息的末尾处添加一个64位的值,该值的内容是填充前原消息的长度(以位为单位),这样信息长度就变为
N*512+448+64=(N+1)*512位
。以消息内容为“ABC”的字符串为例,进行填充补位后得到如下数据:
其中,
65 66 67
为字符串的ASCII值,80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
为填充值,首位为1
,其余位为0
,后面的8个字节18 00 00 00 00 00 00 00
,是字符串的长度,因为是小端字节序存储,所以长度值为24位(3字节)。- 第三步,进行消息分组。
经过上一步消息填充补位后,对消息以512位(64字节)为1组,那么可以分为N组(N大于等于1),每一组消息用M表示,M又划分成16小段(每段32位,4个字节),每个小段可以通过
M[i](0≤0≤15)
进行索引取值。- 第四步,处理分组消息。
首先,对每一小段M都进行四轮循环运算(大循环), 每一轮分别执行函数
FF(),GG(),HH(),II()
各16次(小循环), 以C语言为例,定义一个函数Calc4Cycle(a, b, c, d)
,其代码如下:第一段消息分组处理完后(即4个函数各执行了16次之后),得到新的
a,b,c,d
的值,将它们分别加上原来a,b,c,d
的值(即计算前的值),作为下一段消息(第2个512位(64个字节))的初始a,b,c,d
的值。- 第五步,拼接处理结果。
所有的消息分组处理完成后,得到
a, b, c, d
值, 按照地址的顺序从低到高打印对应的值,就是所求的MD5值。MD5的安全性
正常情况下对MD5进行暴力破解是比较困难的,因为暴力破解的时间是一般人无法接受的。但是,实际上如果把用户的密码进行MD5处理后再存储到数据库,其实是很不安全的。因为用户的密码是比较短的,而且很多用户的密码都使用生日、手机号码、身份证号码,电话号码等等。或者使用常用的一些吉利的数字,或者某个英文单词。如果我把常用的密码先MD5处理,把数据存储起来,然后再跟你的MD5结果匹配,这时我就有可能得到明文。在实际应用中,一般会对用户密码进行加“盐”,使得MD5结果不可预测。
2004年,MD5算法已被中科院王小云院士证明了可以产生碰撞。所以在一些安全要求比较高的场合下不推荐使用MD5算法。MD5可以应用在某些常规场景下,例如下载程序或文件的完整性检查,因为它虽然打破了强碰撞性,但是单一性还是有的,而且它的输出是常见的Hash算法里面最短的,只有128位。