描述: MD5(Messafe - digest algorithm 5)就是信息摘要的一种实现,他可以从任意长度的明文字符串生成128位的哈希值.
摘要哈希生成的正确姿势 :
1.收集相关业务参数,在这里是金额和目标账户,当然,实际应用中的参数肯定比这多得多,这里只是做了简化.
2.按照规则,把参数名和参数值拼接成一个字符串,同时把给定的密钥也拼接起来,之所以需要密钥是因为攻击者也可能获知拼接的规则.
3.利用MD5算法,从原文生成哈希值.MD5生成的哈希值是128位的二进制数,也就是32位的十六进制数.
举个栗子:
业务参数 : 金额 : 1元
目标账户: 1234
按规则拼接: 金额=1_目标账户=1234_key=ABCD
MD5摘要: ASDFGHJHGF56FGH456GHJKLFGHJKL
第三方支付平台如何验证请求的签名? 同样分为三步:
1.发送方和请求方约定相同的字符串拼接规则,约定相同的密钥.
2.第三方支付平台接收到支付请求,按照规则拼接业务参数和密钥,利用MD5算法生成Sign.
3.用第三方平台生成的Sign和请求发送过来的Sign做对比,如果两个Sign值一模一样,则签名无误,如果两个Sign不一样,则信息做了篡改.这个过程叫验签.
只有吧底层细节弄明白才算是真正掌握一门技术:
MD5算法就像一个精密复杂的加工厂,在多条流水线交替协作下生产了最终的哈希值,下面的内容比较烧脑,小伙伴做好准备.
MD5算法底层原理:
简要概括MD5算法过程分为四步:
处理原文,设置初始值,循环加工,拼接结果.
第一步:处理原文
首先,我们计算出原文长度(bit)对512求余的结果,如果不等于448,就需要填充原文使得原味对512求余的结果等于448.填充的方法是第一位填充1,其余位填充0,填充完的长度就是 : 512 * N + 448.
之后,用剩余的位置(512 - 448 = 64位) 记录原文的真实长度,把长度的二进制值补在最后,这样处理后的信息长度就是512*(N+1).
第二步:设置初始值
MD5的哈希结果长度为128位,按照32位分成一组共4组,这4组是由4个初始值A,B,C,D经过不断演变得到,MD5官方视线中,A,B,C,D的初始值如下:
A=0*01234567
B=0*89ABCDEF
C=0*FEDCBA98
D=0*76543210
第三步:循环加工
利用官方的非线性函数,在主循环下面64次子循环中,交替使用,在对处理后的原文分成16等份,再进行交替使用M1~M16进行每次16次循环,在进行左位移,流水线计算的记过和B相加,取代原先的B,新ABCD的产生可以归纳为:
新A = 原d
新B = b+((a+F(b,c,d)+Mj+Ki)<<<s)
新C = 原b
新D = 原c
第四步:拼接结果
把循环加工最终产生的A,B,C,D四个值拼接在一起,转换成字符串即可.