MD5, the full name is Message Digest Algorithm 5 (message digest algorithm fifth edition). For details, please refer to Wikipedia: MD5
MD5 encryption is a byte array, but we generally use its hexadecimal string representation. Of course, hexadecimal strings are case-sensitive. In the MySQL database, Java, and JavaScript languages, Generally, lowercase strings are used to represent them, but in the package officially provided by Oracle database, uppercase strings are returned, which is a pitfall. If you want to execute md5 multiple times, you may need to convert to lowercase.
The relevant code is as follows:
1. Java version MD5
MD5Util.java
package com.cncounter.util.common;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * Java message digest algorithm MD5 tool class, in fact, the implementation of other digest algorithms is also similar*/public class MD5Util { / ** * Perform md5 digest encryption on text. This algorithm has been compared with the md5 digest generated by mysql and JavaScript. * @param plainText * @return The letters in the return value are lowercase*/ public static String md5(String plainText) { if (null == plainText) { plainText = ""; } String MD5Str = ""; try { // JDK 6 supports the following 6 message digests Algorithm, case-insensitive // 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-bit encryption} catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return MD5Str; } // A simplified version of the test public static void main(String[] args) { String m1 = md5("1"); String m2 = md5(m1); /* The output is * m1=c4ca4238a0b923820dcc509a6f75849b * m2=28c8edde3d61a0411511d3b1866f0636 */ System.out.println("m1="+m1); System.out.println("m2="+m2); }}
2. MySQL version MD5
MySQL directly supports md5 function calls
select md5('1') as m1, md5(md5('1')) as m2;
The execution result is:
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 version of MD5 function
The md5.js code is as follows:
/*! MD5 implementation of JavaScript*/// Bracket expressions, (xxxxx) are used to treat the results of internal statements and expressions as one result.// It is common to use eval to parse a json string, and eval is required ("(" +jsonstr+ ")");// () defines a space internally, and the variables defined in it will not pollute the global space. It is very suitable for lib// (function UMD(object/function name name, context this , Definition of function/object)) Returns an anonymous function // Because the result in the first bracket is a function, and the function can be called like this: (function (formal parameter) {}) (actual parameter); // This kind of anonymous The function will be automatically executed once after being parsed by the browser. (function UMD(name, context, definition) { if ( typeof module !== "undefined" && module.exports) { // if module exists, and module.exports exists, then assign the assignment result to it // You can ignore module.exports = definition(); } else if ( typeof define === "function" && define.amd) { // If define This function exists and should be another basic class library, so use define // You can ignore define(definition); } else { // Simpler, it can be seen as: Call the passed definition function and bind the returned object to the global space // Of course, depending on the passed in context, it can also be bound to other objects and become an attribute method. context[name] = definition(name, context); }})("md5", this, function DEF(name, context) {"use strict"; // The above use strict indicates strict syntax mode, and execution will be refused if there is an error. // Ordinary JS is interpreted and executed, but not executed. Some errors will not affect the execution of other codes. // As a class library, it is necessary to use strict mode. The strict mode declaration must be placed at the beginning of a namespace. The beginning. // var old_public_api = (context || {})[name]; // The last object/function to be returned. function md5_func(text) { return hex_md5(text); }; // The following are the details algorithm... You can leave it alone///////////////////////////////////////////////// /////// //Calculate 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)) }; ///////////////////////////////////////////////////// /// // Avoid global namespace conflicts md5_func.noConflict = function publicAPI$noConflict() { if (context) { // Restore that name back to the original object context[name] = old_public_api; } // Return itself, which is held, saved, or assigned to a variable by the calling code return md5_func; }; // The returned object will be bound to a name such as MD5, and this object will be referenced externally. // Because of the closure feature, closure internal methods and internal objects can be used. Lib generally uses this closure feature to maintain private properties and objects. // Only expose some methods (API), that is, functions, to the outside world. Only these APIs can be called from the outside, which facilitates internal logic control and reduces dependencies. return md5_func;})
Test results:
md5("1");"c4ca4238a0b923820dcc509a6f75849b"md5(md5("1"))"28c8edde3d61a0411511d3b1866f0636"
4. Oracle Database Edition MD5
NOTE: To be consistent with MD5 methods in other environments, conversion to lowercase requires the creation of a stored function:
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;
Test results:
SQL> select MD5('1') as m1, MD5(md5('1')) as m2 from dual 2 ;M1---------------------- ------------------M2-------------------------------- -------c4ca4238a0b923820dcc509a6f75849b28c8edde3d61a0411511d3b1866f0636
PS: Here are 2 more MD5 encryption tools for you. Interested friends can refer to them:
MD5 online encryption tool:
http://tools.VeVB.COm/password/CreateMD5Password
Online MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160 encryption tools:
http://tools.VeVB.COm/password/hash_md5_sha