2024-9-24 17:33
62 次阅读|
0 个评论
一 什么是 MD5? MD5(Message-Digest Algorithm 5)是一种常用的哈希函数,通常用于数据加密和安全校验等场合。MD5 算法可以将任意长度的消息输入计算出一个固定长度的摘要,其生成的摘要具有唯一性和不可逆性,因此在一些场景下可以用来验证数据的完整性和真实性。本篇文章将详细介绍 MD5 算法的概念、原理、应用以及安全性问题。 MD5 是 Ronald Rivest 在1991年设计出来的一种哈希函数,其输入可以是任意长度的消息,输出则固定为128位。MD5 的全称是“Message-Digest Algorithm 5”,是 MD2 和 MD4 的改进版本。与前者相比,MD5 可以处理更大的消息,并且经过增加辅助函数和处理流程,其安全性也得到了进一步提高。 MD5 算法的核心思想是将任意长度的消息输入到一个压缩函数中,该函数通过一系列变换将消息转换成固定长度(128位)的消息摘要。由于函数中使用了大量的非线性变换操作,因此即使输入的消息相差只有一位,其输出的摘要也会发生很大的变化,这使得 MD5 算法在密码学、数字签名等领域中被广泛应用。 二 MD5的工作原理 附加填充:首先,MD5算法会对输入数据进行填充,使其长度达到512位的倍数(即64字节的倍数)。填充的方式是在原始数据后添加一个1,然后添加足够多的0,直到满足长度要求。 初始化缓冲区:MD5算法使用四个32位整数(A, B, C, D)作为缓冲区,这四个整数被称为链接变量(Chaining Variables)。这些变量在开始处理数据之前被初始化为特定的值。 处理数据块:算法将数据划分为512位(64字节)的块,并逐一处理这些块。对于每个数据块,算法执行四轮操作(每轮64次迭代),每轮操作都会更新链接变量的值。 生成摘要:当所有数据块都被处理后,算法将链接变量的值作为最终的消息摘要输出。这个摘要是一个128位的值,通常以32个十六进制数的形式表示。 三 MD5编码的特点 确定性:对于相同的输入数据,MD5算法总是生成相同的输出摘要。 雪崩效应:MD5算法对输入数据的微小变化非常敏感,即使只有一个比特位的改变,也会导致输出摘要的显著变化。 单向性:MD5算法是单向的,即无法从摘要中恢复出原始数据。 计算效率:MD5算法在计算上相对高效,可以在短时间内处理大量数据。 四 MD5应用场景 1、校验文件的完整性 如果张三给李四传了一个文件,如何确认这个文件传给李四是完整的呢 张三传文件前,先对文件做一个MD5加密,同时把MD5加密的密文传给李四 李四收到文件,也对该文件做MD5加密,如果得到的密文和张三给的密文一样,就说明文件是完整的。 2、存储用户密码 用户密码,理论上也不能直接明文存储在数据库中,因为一旦数据库被破解,用户的密码就全部丢失了 所以可以将用户密码做一个MD5加密,然后将密文存在数据库中 用户登录的时候,可以将用户的密码进行MD5加密,然后比对密文和数据库中的密文是否一致,来判断用户前台填的密码是否正确。 这只是一个思路,一般不会这么简单,一般生产环境会对用户密码加盐加密等等的处理,用户信息更加重要的,则需要更加复杂的计算逻辑。 五 MD5的原理 MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过一些列的处理后,算法输出由四个32位分组组成的128位散列值。具体的步骤如下所示: 1、填充 如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余结果等于448。填充的方法是填充一个1和n个0。填充完成后,信息的长度为N*512+448 2、记录信息长度 用64位内存来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512 + 448 + 64 = (N+1)*512 3、装入标准的幻数(四个整数) 标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。有点晕哈,其实想一想就明白了。 首先清楚整型的位表示方法,其次标准文档上要求的是:四个幻数在内存地址上从低到高为: A: 01 23 45 67 B: 89 ab cd ef C: fe dc ba 98 D: 76 54 32 10 采用小端表示法表示为A=0X67452301L,则在地址中就是A=01 23 45 67 4、循环运算 4.1、把消息分以512位为一分组进行处理 4.2、每一个分组进行4轮变换,以上面所说4个标准的幻数为起始变量进行计算,重新输出4个变量 4.3、以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。 由上面的介绍,我们知道需要对(N+1)组数据进行处理,所以要循环N+1次,每次的循环执行下面的步骤: 将每一512字节细分成16个小组,每个小组32位(4个字节) 认识一下四个线性函数 F(X,Y,Z)=(X&Y)|((~X)&Z) G(X,Y,Z)=(X&Z)|(Y&(~Z)) H(X,Y,Z)=XYZ I(X,Y,Z)=Y^(X|(~Z)) 设置Mj表示消息的第j个子分组(从0到15), <<< s 表示循环左移s位,则四种操作为: FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<