本文简单介绍一下MD5 HASH的底层实现原理
1. MD5简介
MD5是RSA数据安全公司开发的一种单向散列算法,具体特点是:
- 无论多长多随意的信息,最后都转换成一个固定长度(128bit)的散列值;
- 对于大量不同的信息,最后出来的散列值呈平均分布;
- 对于特定的一个信息,最后出来的散列值都是相同的。
- 已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
2. MD5算法应用
2-1. 一致性验证
MD5典型的应用是对一段meaasge产生信息摘要(message digest),以防止被篡改,例如,平时我们在网上下载软件,而这些软件已经注入了病毒,如果不进行文件域原始发布商的一致性校验的化,很可能造成一定损失。所以平时下载的软件一般包含一个md5文件,用来验证文件的一致性
2-2. 安全访问认证
Unix系统中对用户的密码是一MD5(或其他类似算法)经过hash运算后存储在文件系统中的,在用户登陆时,将密码进行MD5 Hash运算,然后再去和文件系统中的MD5值进行比对。通过这样的步骤,系统会在不知道用户明文密码的情况下实现密码的验证工作。
3. MD5算法实现
3-1. 第一步-填充
首先对信息进行填充,使其位数对512求余的结果是448,因此填充后的信息的位长(Bites length)是N*512+448,填充的规则是在信息的后面,添加1个1和无数个0,知道满足要求为止。
3-2. 第二步-补足长度
将原数据的长度转换位64bit的数值,如果长度超过64bit,只保留最后的64bit,将该64bit数值添加到第一步的信息后面,这样就形成了一个(N+1)*512 bit的信息。
3-3. 第三步-初始化变量
用四个变量,分别位A、B、C、D,均为32bit长,初始化为:
1 | A=(01234567)16 |
3-4. 第四步-操作定义
- 首先定义四个辅助函数(其中 &-与,|-或,~-非,^-亦或,X、Y、Z均为32bit)
1
2
3
4F(X,Y,Z) = (X&Y)|((~X)&Z)
G(X,Y,Z) = (X&Z)|(Y&(~Z))
H(X,Y,Z) = X\^Y\^Z
I(X,Y,Z) = Y^(X|(~Z)) - 定义四个操作(<<< s表示循环左移s位,Mj)
1 | FF(a,b,c,d,Mj,s,ti) 表示 b+((a+F(b,c,d)+Mj+T(i))<<<s) |
3-5. 第五步-分組处理
总共进行4论(N+1),对于前面得到的512(N+1) bit信息,按没512bit进行分组,分成Y1,Y2….YN+1,对于每个Yi分解长M0……M15,每32bit一组。然后进行4*(N+1)论处理。
其中:
a=A=(01234567)16、b=B=(89ABCDEF)16、c=C=(FEDCBA98)16、d=D=(76543210)16
第一轮:
1 | a=FF(a,b,c,d,M0,7,0xd76aa478) |
第二轮:
1 | a=GG(a,b,c,d,M1,5,0xf61e2562) |
第三轮:
1 | a=HH(a,b,c,d,M5,4,0xfffa3942) |
第四轮:
1 | a=II(a,b,c,d,M0,6,0xf4292244) |
3-6. 第六步-输出
1 | #最后: |