古黑币3 个
成长值6467 点
金币133 个
精华贴3 个
今生相逢便是缘分,何苦去怨恨,何苦去仇视。
MD5,全名Message Digest Algorithm 5 ,中文名为消息摘要算法第五版,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。. H8 g2 ~+ Z% t# ~
+ p' \4 _8 s. u
& H" F6 d a. D1 s
* S% ?$ w! h; w; Y# _
2 i, H s5 M; v* O( e- v; R& P, z, W3 F
1 C8 k) W6 H0 t% t7 ?
% ?- J- S0 k0 k$ y& f
9 r9 ~/ G3 W* C1 u9 |4 {" e. v8 z% `
8 J) M' G7 P4 ?2 I. H5 C4 ^9 V
5 O7 Z8 V* h0 _ ~
2 C) a/ ~6 ^. m1 j7 f; k
: W6 z1 C; ]7 j- a
5 \8 m* Q4 A, ^6 _
- M' O4 G6 V2 F/ j
0 G/ h: U- V: I( S$ {) W) ?
! U Q v- u: [) H5 G 1.收集相关业务参数,在这里是金额和目标账户。当然,实际应用中的参数肯定比这多得多,这里只是做了简化。
2 G; L* s8 W* T# ] 2.按照规则,把参数名和参数值拼接成一个字符串,同时把给定的密钥也拼接起来。之所以需要密钥,是因为攻击者也可能获知拼接规则。 e! D# G6 t3 g1 a% ~ m0 x1 G, [
3.利用MD5算法,从原文生成哈希值。MD5生成的哈希值是128位的二进制数,也就是32位的十六进制数。
6 _; V! X" U1 i K% l0 y1 i2 E% W. W6 ?% J3 F
1 o# Z4 [. X& d3 p% J7 Q
7 n, z( P- y0 \9 p
2 m# H, I1 `8 d+ h- @( S3 d 1.发送方和请求方约定相同的字符串拼接规则,约定相同的密钥。
3 x1 B6 `1 _9 I. n 2.第三方平台接到支付请求,按规则拼接业务参数和密钥,利用MD5算法生成Sign。
0 b% A* n; f% a; [" Z1 ~$ z! K 3.用第三方平台自己生成的Sign和请求发送过来的Sign做对比,如果两个Sign值一模一样,则签名无误,如果两个Sign值不同,则信息做了篡改。这个过程叫做验签。
, B5 E2 F- }$ Z. r: {% N/ g
8 a+ Y3 n" Z. W; h$ D: \& r0 U* |+ L1 }4 {0 Z% p
" p5 Q. _ x+ p# i v) F! D! y
2 H) X6 c( L% p; o 简单概括起来,MD5算法的过程分为四步:处理原文,设置初始值,循环加工,拼接结果。 ! O+ H+ h: W7 M6 U
3 c( O2 R H+ @3 w4 X+ |
首先,我们计算出原文长度(bit)对512求余的结果,如果不等于448,就需要填充原文使得原文对512求余的结果等于448。填充的方法是第一位填充1,其余位填充0。填充完后,信息的长度就是512*N+448。
- ? B# p, U5 b& j j 之后,用剩余的位置(512-448=64位)记录原文的真正长度,把长度的二进制值补在最后。这样处理后的信息长度就是512*(N+1)。 ! e' l* `* B/ J8 S
' ^% J J$ a) [, c1 u( E/ {$ }+ ]
2 }$ b" z* S& r4 Q4 ?0 H MD5的哈希结果长度为128位,按每32位分成一组共4组。这4组结果是由4个初始值A、B、C、D经过不断演变得到。MD5的官方实现中,A、B、C、D的初始值如下(16进制): ; c$ d2 w" ]6 \5 e0 Z
9 j4 [, W3 d( p7 Y* f& Q
+ Y1 ~) v: y+ s5 Q- q
2 }( _- @- d5 b4 c 这一步是最复杂的一步,我们看看下面这张图,此图代表了单次A,B,C,D值演变的流程。 F) |" V5 }/ G9 H# C6 _& U
8 N- f% @8 H- i' a+ ]) C3 W2 B
图中,A,B,C,D就是哈希值的四个分组。每一次循环都会让旧的ABCD产生新的ABCD。一共进行多少次循环呢?由处理后的原文长度决定。* C) ~4 \; G) _. H7 q$ A" a9 ?6 H# T
! C$ Z: s. O. p, B+ E- E# V$ K" ^ e
假设处理后的原文长度是M" K& H# T) _, ?+ X" X
主循环次数 = M / 512
6 n' q* ^* z" i1 K 每个主循环中包含 512 / 32 * 4 = 64 次 子循环。: S5 }/ Z7 b/ i' P5 P0 A
) M! e1 `- |0 X* u3 E# |/ J
上面这张图所表达的就是单次子循环的流程。 U% g; t" b( t
& F) T6 |' @% y, K! J* M 下面对图中其他元素一一解释:6 r0 u( O! v( R* Y
+ i2 i3 \. Q; a, R
1.绿色F7 T" l/ W4 U& F# Q9 I& z5 a h
图中的绿色F,代表非线性函数。官方MD5所用到的函数有四种:. e C- B) Z- w4 a. E' w
2 ~/ E' \. W2 W0 t s
F(X, Y, Z) =(X&Y) | ((~X) & Z)
% a% t# y5 L! C; K% zG(X, Y, Z) =(X&Z) | (Y & (~Z))4 V- j7 M { ?4 t9 D% z& i B
H(X, Y, Z) =X^Y^Z! P: V: a5 x/ |
I(X, Y, Z)=Y^(X|(~Z)); k9 I2 w) `1 C9 x7 p* s
0 ?, f# K; j1 C) V, a+ p: M
" P$ v" P* B3 P/ ?4 B2 ] 在主循环下面64次子循环中,F、G、H、I 交替使用,第一个16次使用F,第二个16次使用G,第三个16次使用H,第四个16次使用I。
2 \: W8 s( m7 q) M$ f' Z: u' U7 c
/ v$ f5 g/ m, ~8 {1 V8 M- v 2.红色“田”字/ p0 A# o' y2 R- }/ X
很简单,红色的田字代表相加的意思。' K" A8 f" W( p3 C9 L+ h3 K: K& c
! Y* _& l( z5 c9 c, y4 N1 \ 3.Mi
: c7 M; N, _5 O5 Y8 t Mi是第一步处理后的原文。在第一步中,处理后原文的长度是512的整数倍。把原文的每512位再分成16等份,命名为M0~M15,每一等份长度32。在64次子循环中,每16次循环,都会交替用到M1~M16之一。
# P X8 m1 l, k; A r8 z3 O, ]6 y5 Y' i
4.Ki
8 G! s4 o1 f2 F& q& ]4 q 一个常量,在64次子循环中,每一次用到的常量都是不同的。$ P6 {+ h) e) U, S# J
( p; z: x" _3 J; @- e 5.黄色的<<<S
$ H- L0 ?+ D$ i7 q5 r* M. K2 c 左移S位,S的值也是常量。9 |1 C) b8 H$ G2 {; J
: D; {+ i p3 _* r% P5 H7 l5 S
“流水线”的最后,让计算的结果和B相加,取代原先的B。新ABCD的产生可以归纳为:% Z9 U; c$ X8 b& v# u) o
/ ~% h1 R2 j, b6 X
新A = 原d( O( U3 s) H# V
新B = b+((a+F(b,c,d)+Mj+Ki)<<<s)
. P' k$ ^* D+ J1 V/ `6 D1 U新C = 原b4 \1 v7 V5 v5 H% k/ B
新D = 原c& w% J6 U/ }4 [* `5 E3 S8 h. e1 v
& G; W" h- e8 `+ |4 a
总结一下主循环中的64次子循环,可以归纳为下面的四部分:
0 }; Y: N; `/ t1 y. b
5 _5 n) b( l% B& q" }6 y3 B3 g 第一轮:1 q. x- E8 {# Y# P; B
FF(a,b,c,d,M0,7,0xd76aa478) s[0]=7, K[0] = 0xd76aa478& q- o( S2 _* O: w& |3 W
FF(a,b,c,d,M1,12,0xe8c7b756) s[1]=12, K[1] = 0xe8c7b7565 n+ k4 v1 V: B% o) z7 s- s
FF(a,b,c,d,M2,17,0x242070db)
, z0 c7 S w8 w) ~8 k2 B) R! s FF(a,b,c,d,M3,22,0xc1bdceee)
& {; y# ^4 s/ U FF(a,b,c,d,M4,7,0xf57c0faf)' V K" a4 r, N" Q4 t& K7 m
FF(a,b,c,d,M5,12,0x4787c62a)
4 y6 T! w7 p$ T5 w/ v* v FF(a,b,c,d,M6,17,0xa8304613)( C4 ] O) L0 o; b
FF(a,b,c,d,M7,22,0xfd469501)
; h4 I7 l( t3 r+ w FF(a,b,c,d,M8,7,0x698098d8)- I5 w& x; a# f$ v h& f% r' N
FF(a,b,c,d,M9,12,0x8b44f7af)
# d; w5 C; J' A FF(a,b,c,d,M10,17,0xffff5bb1)0 \/ N+ A, V! n0 D& q- U
FF(a,b,c,d,M11,22,0x895cd7be)
" F: A: k9 e6 W: h FF(a,b,c,d,M12,7,0x6b901122)* F5 `( E4 p; c; h8 B
FF(a,b,c,d,M13,12,0xfd987193)
' Q" G F: B4 \" M* ^ FF(a,b,c,d,M14,17, 0xa679438e)
( ~+ o* F& A# M& s" v M FF(a,b,c,d,M15,22,0x49b40821)
# U5 y( D% _$ ?: G# p* Y/ E% |: S
: y2 Y1 ?! r0 W% s3 u' ~ 第二轮:
6 G+ `! M, o: l0 B GG(a,b,c,d,M1,5,0xf61e2562)0 B! L0 T# [! x) ^, W& z1 _3 W! f
GG(a,b,c,d,M6,9,0xc040b340)
; C* V$ I7 ]' C GG(a,b,c,d,M11,14,0x265e5a51)
3 f( r( V: U0 ]8 L8 J. K GG(a,b,c,d,M0,20,0xe9b6c7aa)
* b2 K) E! I4 ^- _: K GG(a,b,c,d,M5,5,0xd62f105d)
- ^2 W+ s' D, k) k GG(a,b,c,d,M10,9,0x02441453)
$ ]' u+ q, u) L6 x2 X GG(a,b,c,d,M15,14,0xd8a1e681)
+ G1 X$ A0 |; E% Z& [ GG(a,b,c,d,M4,20,0xe7d3fbc8)
; Z9 C/ |: ]! }" w/ O/ u GG(a,b,c,d,M9,5,0x21e1cde6)- Y' y* Z! d! H3 A- Z0 b( P
GG(a,b,c,d,M14,9,0xc33707d6)
c& g, l, p6 B2 i/ N GG(a,b,c,d,M3,14,0xf4d50d87)
' j0 k1 _3 _* [& J$ s) h GG(a,b,c,d,M8,20,0x455a14ed)/ v5 T. y8 \* M/ ~7 `, u- x
GG(a,b,c,d,M13,5,0xa9e3e905)% {, {# h& X ^' S
GG(a,b,c,d,M2,9,0xfcefa3f8)9 ?; [& A( D$ w/ n
GG(a,b,c,d,M7,14,0x676f02d9)" n' ]1 X) W: G( `/ Y
GG(a,b,c,d,M12,20,0x8d2a4c8a)# {. S$ S# r: n' v$ x* o
; ?7 B5 B. ^5 I L+ O 第三轮:$ f$ g" Y' a6 i1 W, p, [
HH(a,b,c,d,M5,4,0xfffa3942)) T/ j6 t- T) R6 I4 N
HH(a,b,c,d,M8,11,0x8771f681)
' I# r" e' T" J5 U5 ]1 |. Q HH(a,b,c,d,M11,16,0x6d9d6122)
% ]& H9 y4 q, r1 Q1 _! a: x HH(a,b,c,d,M14,23,0xfde5380c) t5 Y9 N' m3 Q; r) Y. E
HH(a,b,c,d,M1,4,0xa4beea44)
: {/ ~+ j9 l2 E% ^ HH(a,b,c,d,M4,11,0x4bdecfa9)- `" B4 I; i8 j4 v% v2 w0 m
HH(a,b,c,d,M7,16,0xf6bb4b60)1 m1 L/ f2 `4 |- T1 ~* J' T2 L" {
HH(a,b,c,d,M10,23,0xbebfbc70)
$ \4 h' b5 o; f& V. O% j HH(a,b,c,d,M13,4,0x289b7ec6)
! H1 e- s/ }) M2 B H HH(a,b,c,d,M0,11,0xeaa127fa)
# K$ o; s: P2 _" g5 V HH(a,b,c,d,M3,16,0xd4ef3085)
+ m+ \( a$ P* E( V( D3 w HH(a,b,c,d,M6,23,0x04881d05)5 I: q( \0 q3 _
HH(a,b,c,d,M9,4,0xd9d4d039)
4 `2 S, F% F& l! j HH(a,b,c,d,M12,11,0xe6db99e5)2 l/ u c. H2 p$ \* l# Z
HH(a,b,c,d,M15,16,0x1fa27cf8)
/ j; Y: h; S% q& [ HH(a,b,c,d,M2,23,0xc4ac5665)# S) P( \- a& [1 A0 V) F1 _/ A, {
% M1 X8 W( }* R* X) H6 Z7 g0 S
第四轮:
4 Q7 v# p9 X7 f! z9 H+ ] Ⅱ(a,b,c,d,M0,6,0xf4292244)$ ~! k/ h# Y# [* `) L" W& o, {+ d
Ⅱ(a,b,c,d,M7,10,0x432aff97)
4 w- {! r7 O( T+ Y0 h5 r* \2 ] Ⅱ(a,b,c,d,M14,15,0xab9423a7)6 k' Y* c$ o/ R$ w; o' a& [
Ⅱ(a,b,c,d,M5,21,0xfc93a039)* Q3 N: A9 |! `* i7 [. r
Ⅱ(a,b,c,d,M12,6,0x655b59c3)
8 d* {7 d0 }1 | Ⅱ(a,b,c,d,M3,10,0x8f0ccc92)
* Z+ K% \( {2 }0 A, f Ⅱ(a,b,c,d,M10,15,0xffeff47d)* _/ H! ~8 ?, d# O4 ?. o) M
Ⅱ(a,b,c,d,M1,21,0x85845dd1). v/ u) ]2 r) f, r5 o
Ⅱ(a,b,c,d,M8,6,0x6fa87e4f)
- T6 H1 c& y: @; ~. {( [ Ⅱ(a,b,c,d,M15,10,0xfe2ce6e0); Q5 C9 J9 d# ?, i
Ⅱ(a,b,c,d,M6,15,0xa3014314)/ _4 ]" w& I( K( P; i4 [
Ⅱ(a,b,c,d,M13,21,0x4e0811a1)
; `" u H5 z2 N Ⅱ(a,b,c,d,M4,6,0xf7537e82)
% a& v. m5 @/ A/ g1 V) g( X Ⅱ(a,b,c,d,M11,10,0xbd3af235)7 f6 G. W9 X$ ~+ ?0 f1 P
Ⅱ(a,b,c,d,M2,15,0x2ad7d2bb)
4 y6 `+ a6 k; }4 g. F Ⅱ(a,b,c,d,M9,21,0xeb86d391)
1 C6 ^7 M3 U4 k, e3 h- h6 W( t
: C1 s* [; I; R5 O7 M4 y. G 第四步:拼接结果3 Z# D! u4 ?$ g6 j" ]
9 w: h2 \+ F, k3 T# w& K& E
这一步就很简单了,把循环加工最终产生的A,B,C,D四个值拼接在一起,转换成字符串即可。+ A7 J: S o* s) U: ^
' A2 y0 |: W( y3 P0 a
: n3 ^6 g+ E" T1 y2 n2 I
, W" h) {! G p' z) C, z* P K
' d, P! G; Z b
+ D- o, V9 G. R' ]/ w* q1 d: a本文来自微信公众号:程序员小灰(有重新排版) 作者:玻璃猫 |
评分
-
查看全部评分
|