一文读懂MD5
曾经沧海难为水,除却巫山不是云。-- 元稹
MD5简介
MD5消息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致,MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计。
MD5实现步骤
这里根据rfc1321
中的描述进行说明, 下文的描述中假设有一个b-bit
的消息作为输入,即:
m = m_0 m_1 ... m _{b-1}
步骤一: 数据填充(Append Padding Bits)
MD5是按照分块进行处理的,分块长度为512bit
, 大多数情况下,数据的长度不会恰好满足是512的整数倍,因此需要进行padding到给定的长度。
填充规则: 原始明文消息的b
位之后补100...
, 直到满足b + paddingLength % 512 = 448
, 那如果b % 512
在[448, 512(0)]
之间呢,则在增加一个分块,按照前面的规则填充即可(因为rfc
里面说了,最少填充1bit
)。
步骤二: 长度填充
之前说了,需要满足b + paddingLength % 512 = 448
, 那么对于最后一个分块,就还剩512 - 448 = 64 bit
这剩下的64bit
存放的是原始消息的长度,也就是b
。这也就是说,MD5最多可以处理明文长度小于等于2^64 bit
的数据。
经过上面两个步骤的处理,最终得到的处理后的数据如下图所示:
步骤三: 初始化MD缓冲区
MD Buffer
是4个32bit
的向量,贴一下rfc
的原文:
A four-word buffer (A,B,C,D) is used to compute the message digest. Here each of A, B, C, D is a 32-bit register. These registers are initialized to the following values in hexadecimal, low-order bytes first):
word A:01 23 45 67
word B:89 ab cd ef
word C:fe dc ba 98
word D:76 54 32 10
不过这里要注意一点,程序实现的话,需要按照下面的方式来处理一下(上面加黑的部分, 低字节在前面[low-order byte first]):
let A = 0x67452301;
let B = 0xEFCDAB89;
let C = 0x98BADCFE;
let D