网站英文地图怎么做,电脑上如何做课程视频网站,搜索动图素材的网站,丹东振兴区转载自 玻璃猫 程序员小灰 摘要哈希生成的正确姿势是什么样呢#xff1f;分三步#xff1a;
1.收集相关业务参数#xff0c;在这里是金额和目标账户。当然#xff0c;实际应用中的参数肯定比这多得多#xff0c;这里只是做了简化。
2.按照规则#xff0c;把参数名和参数…转载自 玻璃猫 程序员小灰 摘要哈希生成的正确姿势是什么样呢分三步
1.收集相关业务参数在这里是金额和目标账户。当然实际应用中的参数肯定比这多得多这里只是做了简化。
2.按照规则把参数名和参数值拼接成一个字符串同时把给定的密钥也拼接起来。之所以需要密钥是因为攻击者也可能获知拼接规则。
3.利用MD5算法从原文生成哈希值。MD5生成的哈希值是128位的二进制数也就是32位的十六进制数。 第三方支付平台如何验证请求的签名同样分三步
1.发送方和请求方约定相同的字符串拼接规则约定相同的密钥。
2.第三方平台接到支付请求按规则拼接业务参数和密钥利用MD5算法生成Sign。
3.用第三方平台自己生成的Sign和请求发送过来的Sign做对比如果两个Sign值一模一样则签名无误如果两个Sign值不同则信息做了篡改。这个过程叫做验签。 MD5算法底层原理
简单概括起来MD5算法的过程分为四步处理原文设置初始值循环加工拼接结果。
第一步:处理原文
首先我们计算出原文长度(bit)对512求余的结果如果不等于448就需要填充原文使得原文对512求余的结果等于448。填充的方法是第一位填充1其余位填充0。填充完后信息的长度就是512*N448。
之后用剩余的位置512-44864位记录原文的真正长度把长度的二进制值补在最后。这样处理后的信息长度就是512*(N1)。
第二步:设置初始值
MD5的哈希结果长度为128位按每32位分成一组共4组。这4组结果是由4个初始值A、B、C、D经过不断演变得到。MD5的官方实现中A、B、C、D的初始值如下16进制
A0x01234567
B0x89ABCDEF
C0xFEDCBA98
D0x76543210
第三步:循环加工
这一步是最复杂的一步我们看看下面这张图此图代表了单次A,B,C,D值演变的流程。 图中ABCD就是哈希值的四个分组。每一次循环都会让旧的ABCD产生新的ABCD。一共进行多少次循环呢由处理后的原文长度决定。
假设处理后的原文长度是M
主循环次数 M / 512
每个主循环中包含 512 / 32 * 4 64次 子循环。
上面这张图所表达的就是单次子循环的流程。
下面对图中其他元素一一解释
1.绿色F
图中的绿色F代表非线性函数。官方MD5所用到的函数有四种
F(X, Y, Z) (XY) | ((~X) Z)
G(X, Y, Z) (XZ) | (Y (~Z))
H(X, Y, Z) X^Y^Z
I(X, Y, Z)Y^(X|(~Z))
在主循环下面64次子循环中F、G、H、I 交替使用第一个16次使用F第二个16次使用G第三个16次使用H第四个16次使用I。
2.红色“田”字
很简单红色的田字代表相加的意思。
3.Mi
Mi是第一步处理后的原文。在第一步中处理后原文的长度是512的整数倍。把原文的每512位再分成16等份命名为M0~M15每一等份长度32。在64次子循环中每16次循环都会交替用到M1~M16之一。
4.Ki
一个常量在64次子循环中每一次用到的常量都是不同的。
5.黄色的S
左移S位S的值也是常量。
“流水线”的最后让计算的结果和B相加取代原先的B。新ABCD的产生可以归纳为
新A 原d
新B b((aF(b,c,d)MjKi)s)
新C 原b
新D 原c
总结一下主循环中的64次子循环可以归纳为下面的四部分
第一轮
FF(a,b,c,d,M0,7,0xd76aa478 s[0]7, K[0] 0xd76aa478
FF(a,b,c,d,M1,12,0xe8c7b756s[1]12, K[1] 0xe8c7b756
FF(a,b,c,d,M2,17,0x242070db)
FF(a,b,c,d,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(a,b,c,d,M5,12,0x4787c62a)
FF(a,b,c,d,M6,17,0xa8304613
FF(a,b,c,d,M7,22,0xfd469501
FF(a,b,c,d,M8,7,0x698098d8
FF(a,b,c,d,M9,12,0x8b44f7af)
FF(a,b,c,d,M10,17,0xffff5bb1
FF(a,b,c,d,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122
FF(a,b,c,d,M13,12,0xfd987193
FF(a,b,c,d,M14,17, 0xa679438e)
FF(a,b,c,d,M15,22,0x49b40821
第二轮
GG(a,b,c,d,M1,5,0xf61e2562
GG(a,b,c,d,M6,9,0xc040b340
GG(a,b,c,d,M11,14,0x265e5a51
GG(a,b,c,d,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(a,b,c,d,M10,9,0x02441453
GG(a,b,c,d,M15,14,0xd8a1e681
GG(a,b,c,d,M4,20,0xe7d3fbc8
GG(a,b,c,d,M9,5,0x21e1cde6
GG(a,b,c,d,M14,9,0xc33707d6
GG(a,b,c,d,M3,14,0xf4d50d87
GG(a,b,c,d,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905
GG(a,b,c,d,M2,9,0xfcefa3f8
GG(a,b,c,d,M7,14,0x676f02d9
GG(a,b,c,d,M12,20,0x8d2a4c8a)
第三轮
HH(a,b,c,d,M5,4,0xfffa3942
HH(a,b,c,d,M8,11,0x8771f681
HH(a,b,c,d,M11,16,0x6d9d6122
HH(a,b,c,d,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44
HH(a,b,c,d,M4,11,0x4bdecfa9
HH(a,b,c,d,M7,16,0xf6bb4b60
HH(a,b,c,d,M10,23,0xbebfbc70
HH(a,b,c,d,M13,4,0x289b7ec6
HH(a,b,c,d,M0,11,0xeaa127fa)
HH(a,b,c,d,M3,16,0xd4ef3085
HH(a,b,c,d,M6,23,0x04881d05
HH(a,b,c,d,M9,4,0xd9d4d039
HH(a,b,c,d,M12,11,0xe6db99e5
HH(a,b,c,d,M15,16,0x1fa27cf8
HH(a,b,c,d,M2,23,0xc4ac5665
第四轮
Ⅱa,b,c,d,M0,6,0xf4292244
Ⅱa,b,c,d,M7,10,0x432aff97
Ⅱa,b,c,d,M14,15,0xab9423a7
Ⅱa,b,c,d,M5,21,0xfc93a039
Ⅱa,b,c,d,M12,6,0x655b59c3
Ⅱa,b,c,d,M3,10,0x8f0ccc92
Ⅱa,b,c,d,M10,15,0xffeff47d)
Ⅱa,b,c,d,M1,21,0x85845dd1
Ⅱa,b,c,d,M8,6,0x6fa87e4f)
Ⅱa,b,c,d,M15,10,0xfe2ce6e0)
Ⅱa,b,c,d,M6,15,0xa3014314
Ⅱa,b,c,d,M13,21,0x4e0811a1
Ⅱa,b,c,d,M4,6,0xf7537e82
Ⅱa,b,c,d,M11,10,0xbd3af235
Ⅱa,b,c,d,M2,15,0x2ad7d2bb)
Ⅱa,b,c,d,M9,21,0xeb86d391
第四步:拼接结果
这一步就很简单了把循环加工最终产生的ABCD四个值拼接在一起转换成字符串即可。