MD5, el nombre completo es Algoritmo de resumen de mensajes 5 (quinta edición del algoritmo de resumen de mensajes). Para obtener más información, consulte Wikipedia: MD5.
El cifrado MD5 es una matriz de bytes, pero generalmente usamos su representación de cadena hexadecimal. Por supuesto, las cadenas hexadecimales distinguen entre mayúsculas y minúsculas. En los lenguajes de bases de datos MySQL, Java y JavaScript, generalmente se usan cadenas en minúsculas para representarlas. paquete proporcionado oficialmente por la base de datos Oracle, se devuelven cadenas en mayúsculas, lo cual es un problema. Si desea ejecutar md5 varias veces, es posible que deba convertirlo a minúsculas.
El código relevante es el siguiente:
1. Java versión MD5
MD5Util.java
package com.cncounter.util.common;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * Clase de herramienta MD5 del algoritmo de resumen de mensajes Java, de hecho, la implementación de otros algoritmos de resumen también es similar*/public class MD5Util { / ** * Realizar cifrado de resumen md5 en texto. Este algoritmo se ha comparado con el resumen md5 generado por mysql y JavaScript * @param PlainText * @return. Las letras en el valor de retorno son minúsculas*/ public static String md5(String PlainText) { if (null == PlainText) { PlainText = "" } String MD5Str = "" try { // JDK 6 admite los siguientes 6 mensajes; Algoritmo de resúmenes, que no distingue entre mayúsculas y minúsculas // md5,sha(sha-1),md2,sha-256,sha-384,sha-512 MessageDigest md = MessageDigest.getInstance("MD5"); md.update(plainText.getBytes()); byte b[] = md.digest(); StringBuilder builder = new StringBuilder(32); desplazamiento < b.longitud; desplazamiento++) { i = b[desplazamiento] si (i < 0) i += 256; builder.append("0"); builder.append(Integer.toHexString(i)); } MD5Str = builder.toString(); // LogUtil.println("resultado: " + buf.toString());// Cifrado de 32 bits} catch (NoSuchAlgorithmException e) { e.printStackTrace(); return MD5Str } // Una versión simplificada de la prueba public; static void main(String[] args) { String m1 = md5("1"); String m2 = md5(m1 /* La salida es * m1=c4ca4238a0b923820dcc509a6f75849b * m2=28c8edde3d61a0411511d3b1866f0636 */ Sistema.out.println("m1="+m1); Sistema.out.println("m2="+m2);
2. MySQL versión MD5
MySQL admite directamente llamadas a funciones md5
seleccione md5('1') como m1, md5(md5('1')) como m2;
El resultado de la ejecución es:
MariaDB [(ninguno)]> seleccione md5('1') como m1, md5(md5('1')) como m2;+-------------------- ------ ---------------+---------------------- ------+ | m1 | m2 |+---------------------------------+-- -------- ------------------------+| c4ca4238a0b923820dcc509a6f75849b | 28c8edde3d61a0411511d3b1866f0636 |+----------------------------------+------------ --------- -----------------------+1 fila en conjunto (0,00 seg)
3. Versión JavaScript de la función MD5
El código md5.js es el siguiente:
/*! Implementación MD5 de JavaScript*/// Las expresiones entre corchetes, (xxxxx) se usan para tratar los resultados de declaraciones y expresiones internas como un solo resultado.// Es común usar eval para analizar una cadena json, y se requiere eval ("(" +jsonstr+ ")");// () define un espacio internamente, y las variables definidas en él no contaminarán el espacio global. Es muy adecuado para lib// (función UMD (nombre de objeto/función). , contexto esto , Definición de función/objeto)) Devuelve una función anónima // Porque el resultado en el primer paréntesis es una función, y la función se puede llamar así: (función (parámetro formal) {}) (parámetro real); tipo de anónimo La función se ejecutará automáticamente una vez después de ser analizada por el navegador (función UMD (nombre, contexto, definición) { if (tipo de módulo! == "undefinido" && module.exports) { // if module. existe y module.exports existe, luego asígnele el resultado de la asignación // Puede ignorar module.exports = definición() } else if ( typeof define === "function" && define.amd) { // Si define; Esta función existe y debería ser otra biblioteca de clases básica, así que use define // Puede ignorar define(definition); Llame a la función de definición pasada y vincule el objeto devuelto al espacio global // Por supuesto, dependiendo del contexto pasado, también puede vincularse a otros objetos y convertirse en un método de atributo contexto[nombre] = definición(nombre, contexto. ); }})("md5", this, function DEF(name, context) {"use estricto"; // El uso estricto anterior indica un modo de sintaxis estricto y la ejecución se rechazará si hay un error. // El JS ordinario se interpreta y ejecuta, pero no se ejecuta. Algunos errores no afectarán la ejecución de otros códigos. // Como biblioteca de clases, es necesario utilizar el modo estricto. La declaración del modo estricto debe colocarse al comienzo de un espacio de nombres. El comienzo. // var old_public_api = (context || {})[nombre]; // El último objeto/función que se devolverá. function md5_func(text) { return hex_md5(text }); el algoritmo de detalles... Puedes dejarlo solo////////////////////////////////////////////// //// /////// // Calcular MD5 var hexcase = 0; function hex_md5(a) { if (a == "") return a; rstr2hex(rstr_md5(str2rstr_utf8(a))) }; función hex_hmac_md5(a, b) { retorno rstr2hex(rstr_hmac_md5(str2rstr_utf8(a), str2rstr_utf8(b))) }; hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72" }; función rstr_md5(a) { return binl2rstr(binl_md5(rstr2binl(a), a.length * 8)) }; f) { var e = rstr2binl(c); if (e.length > 16) { e = binl_md5(e, c.length * 8) } var a = Array(16), d = Array(16); var b = 0; b < 16; b++) { a[b] = e[b] ^ 909522486; ^ 1549556828 } var g = binl_md5(a.concat(rstr2binl(f)), 512 + f.length * 8); return binl2rstr(binl_md5(d.concat(g), 512 + 128)) }; ) { intentar { hexcase } catch(g) { hexcase = 0 } var f = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var b = ""; var a; para (var d = 0; d < c.length; d++) { a = c.charCodeAt(d); = f.charAt((a >>> 4) & 15) + f.charAt(a & 15) } return b }; función str2rstr_utf8(c) { var b = ""; var d = -1; mientras (++d < c.length) { a = c.charCodeAt(d); e = d + 1 < c.length ? c.charCodeAt(d + 1): 0 si (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) y 31), 128 | (a y 63)) } else { if (a <= 65535) { b += String.fromCharCode(224 | ((a >>> 12) y 15 ), 128 | ((a >>> 6) & 63), 128 | (a & 63)) } más { si (a <= 2097151) { b += String.fromCharCode(240 | ((a >>> 18) y 7), 128 | ((a >>> 12) y 63), 128 | ((a >>> 6) y 63 ), 128 | (a & 63)) } } } } } devolver b }; = 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) } devolver una función }; binl2rstr(b) { var a = ""; for (var c = 0; c < b.length * 32; c += 8) { a += String.fromCharCode((b[c >> 5] >>> (c % 32)) & 255) } devolver a }; función binl_md5(p, k) { p[k >> 5] |= 128 << ((k) % 32); p[(((k + 64) >>> 9) << 4) + 14] = k; var o = 1732584193; para (var g = 0; g < p.longitud; g += 16) { var j = o; var h = n; var f = m; var e = l; md5_ff(o, n, m, l, p[g + 0], 7, -680876936); md5_ff(l, o, n, m, p[g + 1], 12, -389564586); l, o, n, p[g + 2], 17, 606105819, -1044525330); , m, l, p[g + 4], 7, -176418897); md5_ff(l, o, n, m, p[g + 5], 12, 1200080426 = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341); (n, m, l, o, p[g + 7], 22, -45705983); o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416), 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); 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); 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); norte, p[g + 11], 14, 643717713); l, o, p[g + 0], 20, -373897302); o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691); n, m, p[g + 10], 9, 38016083); o, n, p[g + 15], 14, -660478335; n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848); metro, 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); m, l, o, p[g + 8], 20, 1163531501); md5_gg(o, n, m, l, p[g + 13], 5, -1444681467 = l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784); 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); 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); ], 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); , p[g + 0], 11, -358537222); md5_hh(m, l, o, n, p[g + 3], 16, -722521979 = n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189); (o, n, m, l, p[g + 9], 4, -640364487); l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835; 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); 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); 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); l, o, p[g + 1], 21, -2054922799); md5_ii(o, n, m, l, p[g + 8], 6, 1873313359; l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744); (m, l, o, n, p[g + 6], 15, -1560198380); n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649); 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); ], 21, -343485551); o = seguro_add(o, j); safe_add(n, h); m = safe_add(m, f); l = safe_add(l, e) } return Array(o, n, m, l) }; , f) { return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d) }; md5_ff(g, f, k, j, e, i, h) { return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h) }; g, f, k, j, e, i, h) { return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h) }; md5_hh(g, f, k, j, e, i, h) { return md5_cmn(f ^ k ^ j, g, f, e, i, h) }; , i, h) { return md5_cmn(k ^ (f | (~j)), g, f, e, i, h) }; var c = (a & 65535) + (d & 65535); var b = (a >> 16) + (d >> 16) + (c >> 16); 65535) }; función bit_rol(a, b) { retorno (a << b) | (a >>> (32 - b)) }; ////////////////////////////////////////////////// /// /// // Evitar conflictos globales de espacios de nombres md5_func.noConflict = function publicAPI$noConflict() { if (context) { // Restaurar ese nombre al objeto original context[name] = old_public_api } // El retorno en sí, que se mantiene, se guarda o se asigna a una variable mediante el código de llamada return md5_func }; // El objeto devuelto estará vinculado a un nombre como MD5 y se hará referencia a este objeto externamente. Se pueden utilizar la función de cierre, métodos internos de cierre y objetos internos. Lib generalmente usa esta función de cierre para mantener propiedades y objetos privados. // Solo expone algunos métodos (API), es decir, funciones al mundo exterior. Solo estas API se pueden llamar desde el exterior, lo que facilita el control de la lógica interna y reduce. dependencias. devolver md5_func;})
Resultados de la prueba:
md5("1");"c4ca4238a0b923820dcc509a6f75849b"md5(md5("1"))"28c8edde3d61a0411511d3b1866f0636"
4. Edición de base de datos Oracle MD5
NOTA: Para ser coherente con los métodos MD5 en otros entornos, la conversión a minúsculas requiere la creación de una función almacenada:
CREAR O REEMPLAZAR LA FUNCIÓN MD5 (contraseña EN VARCHAR2) DEVOLVER VARCHAR2 ES retval varchar2 (32); COMENZAR la recuperación: = Lower (utl_raw.cast_to_raw (DBMS_OBFUSCATION_TOOLKIT.MD5 (INPUT_STRING => contraseña))));
Resultados de la prueba:
SQL> seleccione MD5('1') como m1, MD5(md5('1')) como m2 de dual 2;M1---------------------- ------------------M2------------------------------- - -------c4ca4238a0b923820dcc509a6f75849b28c8edde3d61a0411511d3b1866f0636
PD: Aquí hay 2 herramientas de cifrado MD5 más para que los amigos interesados puedan consultarlas:
Herramienta de cifrado en línea MD5:
http://tools.VeVB.COm/password/CreateMD5Password
Herramientas de cifrado MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160 en línea:
http://tools.VeVB.COm/password/hash_md5_sha