MD5算法(Message-Digest algorithm 5)
不同于BASE64算法,md5是一种摘要算法
。md5算法可以将任意长度的字符串生成128bit的二进制哈希值,也就是32位的16进制数。
所以,我们看到的md5加密之后的加密串都是由0~9,a~f
这16个字符组成的,且长度为32个字符。
加密过程
md5算法的加密过程分为四步:1.处理原文;2.设置初始值;3.循环加工;4.拼接结果。
其中,第2、4步很简单,第1步需要填充原文,难点和重点在于第3步。
1. 处理原文
这步将要加密的信息bit数处理成512的倍数。
先对明文字符串取余,如果余数不等于448,就对原文进行填充。填充的方法是第1位为1,其余置0。填充后,信息的长度=512 * M + 448。 512-448=64位的长度用来记录原文真正的长度。
处理后,原文的真正长度为512 * (M + 1)。
2. 设置初始值
md5的哈希结果为128bit,将128bit按照每组32bit分成4组。每组是由4个初始值A、B、C、D经过不断演变得到的。
官方文档中,4个初始值为16进制数:
A=0x1234567;
B=89abcdef;
C=fedcba98;
D=76543210;
3. 循环加工
分为主循环和子循环。每次循环由4个旧A、B、C、D值生成4个新的A、B、C、D值。
主循环一共M次(原文长度 / 512)。
子循环一共512 / 32 * 4 = 64次。
(循环过程略,巨复杂)
4. 拼接结果
将3中生成的A、B、C、D拼接到一起,转换成字符串就是加密后的128bit加密串。
用途
由于明文只要发生一点改变,生成的md5值就会大相径庭,所以md5一般用在用户登录、支付等业务。用来校验参数是否被篡改过。
加密时,除了正常的参数外,加上一个额外的参数sign。将其他参数和双方约定的密钥key按照一定规则组合起来,生成一段信息,再利用md5算法将这段信息加密成密文,赋给sign。
解密时,按照同样的规则生成一段密文,校验生成的密文和sign参数是否相同。由此来判断其他参数是否被篡改过。
破解
md5算法理论上可破解,比如:
- 暴力枚举法(时间);
- 字典法(空间);
- 彩虹表法;
- 差分攻击(国人的贡献);
但对md5的破解并非是还原成原文,实际上是一种“碰撞”,比如消息A的md5值是M,消息B的md5值也是M。那么,就算原文是A,只要找到了B,也是一种破解。
假设md5算法的哈希函数是H(x)。
H(A) = M;
H(B1) = M; H(B2) = M; H(B3) = M; ......
任意一个Bx都是对A的破解。