国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java、JavaScript、Oracle、MySQL中實現的MD5加密算法分享

Java、JavaScript、Oracle、MySQL中實現的MD5加密算法分享

2019-11-28 14:17java教程網 JAVA教程

這篇文章主要介紹了Java、JavaScript、Oracle、MySQL中實現的MD5加密算法分享,需要的朋友可以參考下

MD5,全稱為 Message Digest Algorithm 5(消息摘要算法第五版).

MD5加密后是一個字節數組, 但我們一般是取其十六進制的字符串表示法,當然,十六進制數字符串是區分大小寫,在 mysql數據庫,Java,和JavaScript語言中,一般是使用小寫的字符串來表示, 而在 Oracle數據庫官方提供的包中,返回的是大寫字符串,這算是一個坑,如果你想要執行多次 md5,可能需要轉換為小寫.

相關的代碼如下:

1. Java版MD5

MD5Util.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.cncounter.util.common;
 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
/**
 * Java消息摘要算法 MD5 工具類,其實其他摘要算法的實現也類似
 */
public class MD5Util {
 /**
  * 對文本執行 md5 摘要加密, 此算法與 mysql,JavaScript生成的md5摘要進行過一致性對比.
  * @param plainText
  * @return 返回值中的字母為小寫
  */
 public static String md5(String plainText) {
  if (null == plainText) {
   plainText = "";
  }
  String MD5Str = "";
  try {
   // JDK 6 支持以下6種消息摘要算法,不區分大小寫
   // md5,sha(sha-1),md2,sha-256,sha-384,sha-512
   MessageDigest md = MessageDigest.getInstance("MD5");
   md.update(plainText.getBytes());
   byte b[] = md.digest();
 
   int i;
 
   StringBuilder builder = new StringBuilder(32);
   for (int offset = 0; offset < b.length; offset++) {
    i = b[offset];
    if (i < 0)
     i += 256;
    if (i < 16)
     builder.append("0");
    builder.append(Integer.toHexString(i));
   }
   MD5Str = builder.toString();
   // LogUtil.println("result: " + buf.toString());// 32位的加密
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
  return MD5Str;
 }
 // 一個簡版測試
 public static void main(String[] args) {
  String m1 = md5("1");
  String m2 = md5(m1);
  /* 輸出為
   * m1=c4ca4238a0b923820dcc509a6f75849b
   * m2=28c8edde3d61a0411511d3b1866f0636
   */
  System.out.println("m1="+m1);
  System.out.println("m2="+m2);
 }
}

2. MySQL版MD5

MySQL直接支持 md5函數調用

?
1
select md5('1') as m1, md5(md5('1')) as m2;

執行結果為:

?
1
2
3
4
5
6
7
MariaDB [(none)]> select md5('1') as m1, md5(md5('1')) as m2;
+----------------------------------+----------------------------------+
| m1        | m2        |
+----------------------------------+----------------------------------+
| c4ca4238a0b923820dcc509a6f75849b | 28c8edde3d61a0411511d3b1866f0636 |
+----------------------------------+----------------------------------+
1 row in set (0.00 sec)

3. JavaScript 版MD5函數

md5.js 代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/*! JavaScript 的 MD5 實現 */
 
// 括號表達式, (xxxxx) 是用來將內部的語句、表達式的結果作為一個結果.
// 常見的是將json字符串用 eval 解析時,需要 eval("(" +jsonstr+ ")");
// () 內部定義了一個空間, 里面定義的變量不會污染到全局空間,很適合做lib
// (function UMD(對象/函數名name, 上下文this, 函數/對象的定義)) 返回一個匿名函數
// 因為第一個括號內 的結果是一個函數,而函數可以這樣調用: (function(形參){})(實參);
// 這種匿名函數被瀏覽器解析后會自動執行一次.
(function UMD(name, context, definition) {
 if ( typeof module !== "undefined" && module.exports) {
 // 如果 module 存在,并且module.exports存在,則將賦值結果賦給 它
 // 可以不用管
 module.exports = definition();
 } else if ( typeof define === "function" && define.amd) {
 // 如果 define 這個函數存在,應該是另一個基礎類庫,則使用define
 // 可以不用管
 define(definition);
 } else {
 // 簡單一點,可以看成: 調用傳入的definition函數,將返回的對象綁定到全局空間
 // 當然,根據傳入的上下文不同,也可以綁定到其他對象下面,成為一個屬性方法.
 context[name] = definition(name, context);
 }
}
)("md5", this, function DEF(name, context) {"use strict";
 // 上面的 use strict 表示嚴格語法模式,有錯誤就拒絕執行.
 // 而普通的JS,是解釋執行,不執行的地方,有些錯誤也不影響其他代碼的執行
 // 作為類庫,使用嚴格模式是很有必要的.嚴格模式聲明必須放到一個namespace空間的最起始處.
 
 //
 var old_public_api = (context || {})[name];
 // 最后要返回的對象/函數.
 function md5_func(text) {
 return hex_md5(text);
 };
 // 下面一堆是具體的算法... 可以先不用管
 /////////////////////////////////////////////////////
 
 //計算MD5
 var hexcase = 0;
 function hex_md5(a) {
 if (a == "")
 return a;
 return rstr2hex(rstr_md5(str2rstr_utf8(a)))
 };
 function hex_hmac_md5(a, b) {
 return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a), str2rstr_utf8(b)))
 };
 function md5_vm_test() {
 return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72"
 };
 function rstr_md5(a) {
 return binl2rstr(binl_md5(rstr2binl(a), a.length * 8))
 };
 function rstr_hmac_md5(c, f) {
 var e = rstr2binl(c);
 if (e.length > 16) {
 e = binl_md5(e, c.length * 8)
 }
 var a = Array(16), d = Array(16);
 for (var b = 0; b < 16; b++) {
 a[b] = e[b] ^ 909522486;
 d[b] = e[b] ^ 1549556828
 }
 var g = binl_md5(a.concat(rstr2binl(f)), 512 + f.length * 8);
 return binl2rstr(binl_md5(d.concat(g), 512 + 128))
 };
 function rstr2hex(c) {
 try { hexcase
 } catch(g) {
 hexcase = 0
 }
 var f = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
 var b = "";
 var a;
 for (var d = 0; d < c.length; d++) {
 a = c.charCodeAt(d);
 b += f.charAt((a >>> 4) & 15) + f.charAt(a & 15)
 }
 return b
 };
 function str2rstr_utf8(c) {
 var b = "";
 var d = -1;
 var a, e;
 while (++d < c.length) {
 a = c.charCodeAt(d);
 e = d + 1 < c.length ? c.charCodeAt(d + 1) : 0;
 if (55296 <= a && a <= 56319 && 56320 <= e && e <= 57343) {
 a = 65536 + ((a & 1023) << 10) + (e & 1023);
 d++
 }
 if (a <= 127) {
 b += String.fromCharCode(a)
 } else {
 if (a <= 2047) {
  b += String.fromCharCode(192 | ((a >>> 6) & 31), 128 | (a & 63))
 } else {
  if (a <= 65535) {
  b += String.fromCharCode(224 | ((a >>> 12) & 15), 128 | ((a >>> 6) & 63), 128 | (a & 63))
  } else {
  if (a <= 2097151) {
  b += String.fromCharCode(240 | ((a >>> 18) & 7), 128 | ((a >>> 12) & 63), 128 | ((a >>> 6) & 63), 128 | (a & 63))
  }
  }
 }
 }
 }
 return b
 };
 function rstr2binl(b) {
 var a = Array(b.length >> 2);
 for (var c = 0; c < a.length; c++) {
 a[c] = 0
 }
 for (var c = 0; c < b.length * 8; c += 8) {
 a[c >> 5] |= (b.charCodeAt(c / 8) & 255) << (c % 32)
 }
 return a
 };
 function binl2rstr(b) {
 var a = "";
 for (var c = 0; c < b.length * 32; c += 8) {
 a += String.fromCharCode((b[c >> 5] >>> (c % 32)) & 255)
 }
 return a
 };
 function binl_md5(p, k) {
 p[k >> 5] |= 128 << ((k) % 32);
 p[(((k + 64) >>> 9) << 4) + 14] = k;
 var o = 1732584193;
 var n = -271733879;
 var m = -1732584194;
 var l = 271733878;
 for (var g = 0; g < p.length; g += 16) {
 var j = o;
 var h = n;
 var f = m;
 var e = l;
 o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936);
 l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586);
 m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819);
 n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330);
 o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897);
 l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426);
 m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341);
 n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983);
 o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416);
 l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417);
 m = md5_ff(m, l, o, n, p[g + 10], 17, -42063);
 n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162);
 o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682);
 l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101);
 m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290);
 n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329);
 o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510);
 l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632);
 m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713);
 n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302);
 o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691);
 l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083);
 m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335);
 n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848);
 o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438);
 l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690);
 m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961);
 n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501);
 o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467);
 l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784);
 m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473);
 n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734);
 o = md5_hh(o, n, m, l, p[g + 5], 4, -378558);
 l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463);
 m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562);
 n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556);
 o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060);
 l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353);
 m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632);
 n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640);
 o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174);
 l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222);
 m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979);
 n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189);
 o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487);
 l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835);
 m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520);
 n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651);
 o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844);
 l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415);
 m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905);
 n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055);
 o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571);
 l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606);
 m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523);
 n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799);
 o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359);
 l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744);
 m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380);
 n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649);
 o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070);
 l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379);
 m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259);
 n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551);
 o = safe_add(o, j);
 n = safe_add(n, h);
 m = safe_add(m, f);
 l = safe_add(l, e)
 }
 return Array(o, n, m, l)
 };
 function md5_cmn(h, e, d, c, g, f) {
 return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)
 };
 function md5_ff(g, f, k, j, e, i, h) {
 return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h)
 };
 function md5_gg(g, f, k, j, e, i, h) {
 return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h)
 };
 function md5_hh(g, f, k, j, e, i, h) {
 return md5_cmn(f ^ k ^ j, g, f, e, i, h)
 };
 function md5_ii(g, f, k, j, e, i, h) {
 return md5_cmn(k ^ (f | (~j)), g, f, e, i, h)
 };
 function safe_add(a, d) {
 var c = (a & 65535) + (d & 65535);
 var b = (a >> 16) + (d >> 16) + (c >> 16);
 return (b << 16) | (c & 65535)
 };
 function bit_rol(a, b) {
 return (a << b) | (a >>> (32 - b))
 };
 
 /////////////////////////////////////////////////////
 
 // 避免全局命名空間沖突
 md5_func.noConflict = function publicAPI$noConflict() {
 if (context) {
 // 將那個 name還原回原來的對象
 context[name] = old_public_api;
 }
 // 返回自身,由調用的代碼自己持有,保存,或賦值給某個變量
 return md5_func;
 };
 
 // 返回的對象,會被綁定到 MD5 之類的名字上,在外部就引用了此對象,
 // 因為閉包特性,可以利用到閉包內部方法和內部對象。 lib一般都是利用這種閉包特性,維護私有的屬性、對象,
 // 對外只暴露一些方法(API),也就是 function, 外面只能調用這些API,方便內部進行邏輯控制,降低依賴.
 return md5_func;
})

測試結果:

?
1
2
3
4
md5("1");
"c4ca4238a0b923820dcc509a6f75849b"
md5(md5("1"))
"28c8edde3d61a0411511d3b1866f0636"

4. Oracle 數據庫版MD5

注意: 為了與在其他環境下的MD5方法一致,需要轉換為小寫
需要創建一個存儲函數:

?
1
2
3
4
5
6
7
8
CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2) RETURN VARCHAR2 IS
 retval varchar2(32);
BEGIN
 retval := Lower(utl_raw.cast_to_raw(
DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd))
);
 RETURN retval;
END;

測試結果:

?
1
2
3
4
5
6
7
8
9
SQL> select MD5('1') as m1, MD5(md5('1')) as m2 from dual
 2 ;
 
M1
---------------------------------------
M2
---------------------------------------
c4ca4238a0b923820dcc509a6f75849b
28c8edde3d61a0411511d3b1866f0636

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品成人国产乱一区 | 韩国理论电影在线 | 国产精品久久久久久吹潮 | 亚洲福利在线观看 | 91精品国产综合久久久久久漫画 | 91精品国产91久久久久久最新 | 亚洲视频一区 | 国产一区二区久久久 | 亚洲91| 亚洲一区二区三区免费看 | 国产高清美女一级a毛片久久 | 久久aⅴ乱码一区二区三区 一区二区精品视频 | 免费av观看| 国产羞羞视频在线观看 | 国产欧美日韩综合精品一区二区 | 黄色电影在线免费观看 | 国产高清视频一区二区 | 国精产品99永久一区一区 | 黄频免费在线观看 | 国产精品免费视频一区 | 伊人久久综合 | 香蕉久久一区二区不卡无毒影院 | 久久久精品国产 | 久久久国产精品入口麻豆 | 精品人成| 激情久久久 | 99久久婷婷国产精品综合 | 亚洲免费影院 | 99这里只有精品 | 99精品久久| 国内免费自拍视频 | 久久视频免费 | 国产一区二区三区成人 | 国产精品久久久久久av公交车 | 色在线免费观看 | 成人免费网站在线 | 一区二区三区久久久 | 国产精品尤物麻豆一区二区三区 | 亚洲欧美一区二区视频 | 日韩一区二区三区电影在线观看 | 国产福利91精品一区二区三区 |