MD5, der vollständige Name lautet Message Digest Algorithm 5 (Message Digest Algorithm, fünfte Ausgabe). Weitere Informationen finden Sie in Wikipedia: MD5
Bei der MD5-Verschlüsselung handelt es sich um ein Byte-Array, aber wir verwenden im Allgemeinen dessen hexadezimale Zeichenfolgendarstellung. In der MySQL-Datenbank, Java und JavaScript-Sprachen werden im Allgemeinen Kleinbuchstaben verwendet, aber in der Paket, das offiziell von der Oracle-Datenbank bereitgestellt wird, werden Zeichenfolgen in Großbuchstaben zurückgegeben, was eine Gefahr darstellt. Wenn Sie md5 mehrmals ausführen möchten, müssen Sie möglicherweise in Kleinbuchstaben konvertieren.
Der entsprechende Code lautet wie folgt:
1. Java-Version MD5
MD5Util.java
package com.cncounter.util.common;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * Java Message Digest-Algorithmus MD5-Toolklasse, tatsächlich ist die Implementierung anderer Digest-Algorithmen auch ähnlich*/public class MD5Util { / ** * MD5-Digest-Verschlüsselung für Text durchführen. Dieser Algorithmus wurde mit dem von MySQL und JavaScript generierten MD5-Digest verglichen Die Buchstaben im Rückgabewert sind Kleinbuchstaben*/ public static String md5(String plainText) { if (null == plainText) { plainText = "" } String MD5Str = ""; try { // JDK 6 unterstützt die folgenden 6 Nachrichten Digest-Algorithmus, Groß- und Kleinschreibung wird nicht beachtet // md5,sha(sha-1),md2,sha-256,sha-384,sha-512 MessageDigest md = MessageDigest.getInstance("MD5"); md.update(plainText.getBytes()); for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) i += 256; builder.append("0"); builder.append(Integer.toHexString(i)); MD5Str = builder.toString(); // LogUtil.println("result: " + buf.toString());// 32-Bit-Verschlüsselung} Catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return MD5Str } // Eine vereinfachte Version des Tests public static void main(String[] args) { String m1 = md5("1"); String m2 = md5(m1); System.out.println("m1="+m1); System.out.println("m2="+m2);
2. MySQL-Version MD5
MySQL unterstützt MD5-Funktionsaufrufe direkt
wähle md5('1') als m1, md5(md5('1')) als m2;
Das Ausführungsergebnis ist:
MariaDB [(none)]> select md5('1') as m1, md5(md5('1')) as m2;+-------------------- ------ ---------------+--------------------------- ------+ |. m1 |. m2 |+-------------------+-- -------- ---------+|. c4ca4238a0b923820dcc509a6f75849b | 28c8edde3d61a0411511d3b1866f0636 |+----------------------------------+-------------------------- --------- --------+1 Zeile im Satz (0,00 Sek.)
3. JavaScript-Version der MD5-Funktion
Der md5.js-Code lautet wie folgt:
/*! MD5-Implementierung von JavaScript*/// Klammerausdrücke (xxxxx) werden verwendet, um die Ergebnisse interner Anweisungen und Ausdrücke als ein Ergebnis zu behandeln.// Es ist üblich, eval zum Parsen einer JSON-Zeichenfolge zu verwenden, und eval ist erforderlich ("(" +jsonstr+ ")");// () definiert intern einen Raum, und die darin definierten Variablen verschmutzen den globalen Raum nicht. Es eignet sich sehr gut für lib// (Funktion UMD(Objekt-/Funktionsname Name , Kontext dies , Definition von Funktion/Objekt)) Gibt eine anonyme Funktion zurück // Da das Ergebnis in der ersten Klammer eine Funktion ist und die Funktion wie folgt aufgerufen werden kann: (Funktion (formeller Parameter) {}) (aktueller Parameter); Art von anonym Die Funktion wird automatisch einmal ausgeführt, nachdem sie vom Browser analysiert wurde (function UMD(name, context, definition) { if ( typeof module !== "undefined" && module.exports) { // if module existiert und module.exports existiert, dann weisen Sie ihm das Zuweisungsergebnis zu // Sie können module.exports = definition(); } else if ( typeof define === "function" && define.amd) { // If define Diese Funktion existiert und sollte eine weitere grundlegende Klassenbibliothek sein, also verwenden Sie define // Sie können define(definition); ignorieren; } else { // Einfacher kann es so gesehen werden: Rufen Sie die übergebene Definitionsfunktion auf und binden Sie das zurückgegebene Objekt an den globalen Raum // Abhängig vom übergebenen Kontext kann es natürlich auch an andere Objekte gebunden werden und zu einer Attributmethode werden context[name] = definition(name, context ); }})("md5", this, function DEF(name, context) {"use strict"; // Die obige Verwendung strict gibt den strikten Syntaxmodus an und die Ausführung wird abgelehnt, wenn ein Fehler auftritt. // Gewöhnliches JS wird interpretiert und ausgeführt, aber nicht ausgeführt. Einige Fehler wirken sich nicht auf die Ausführung anderer Codes aus. // Als Klassenbibliothek muss die Deklaration des strikten Modus am Anfang platziert werden . Der Anfang. // var old_public_api = (context || {})[name] // Das letzte zurückzugebende Objekt/Funktion md5_func(text) { return hex_md5(text); der Detailalgorithmus... Du kannst es in Ruhe lassen////////////////////////////////////////// //// /////// //MD5 berechnen var hexcase = 0; function hex_md5(a) { if (a == "") return a; 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); 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)) }; function rstr2hex(c ) { try { hexcase } Catch(g) { hexcase = 0 } var f = hexcase ? "0123456789abcdef"; var a; for (var d = 0; d < c.length; d++) { a = c.charCodeAt(d); = f.charAt((a >>> 4) & 15) + f.charAt(a & 15) } return b }; function str2rstr_utf8(c) { var d = -1; var a, e; 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); 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 }; = 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 }; 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 = -271733879; var l = 271733878; für (var g = 0; g < p.length; g += 16) { var j = o; var f = m; var e = o = md5_ff(o, n, m, l, 7, -680876936); md5_ff(l, o, n, m, p[g + 1], 12, -389564586); l, o, n, p[g + 2], 17, 606105819); n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330); , m, l, p[g + 4], 7, -176418897); md5_ff(l, o, n, m, p[g + 5], 12, 1200080426); (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); 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); m = md5_gg(m, l, o, n, 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); m, l, p[g + 9], 5, 568446438); o, n, m, p[g + 14], 9, -1019803690); m, l, o, p[g + 8], 20, 1163531501); md5_gg(o, n, m, l, p[g + 13], 5, -1444681467); 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, p[g + 4], 11, 1272893353); ], 16, -155497632); 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); md5_hh(m, l, o, n, p[g + 3], 16, -722521979); (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); 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); p[g + 12], 6, 1700485571); 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); (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 = safe_add(o, j); sicher_add(n, h); m = sicher_add(m, f); l = sicher_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) }; function md5_ii(g, f, k, j, e , i, h) { return md5_cmn(k ^ (f | (~j)), g, f, e, i, h) }; var c = (a & 65535) + (d & 65535); var b = (a >> 16) + (c >> 16) | (c & 65535) }; function bit_rol(a, b) { return (a << b) | (a >>> (32 - b)) }; ////////////////////////////////////////////////////////////////////////// /// /// // Vermeiden Sie globale Namespace-Konflikte md5_func.noConflict = function publicAPI$noConflict() { if (context) { // Stellen Sie diesen Namen wieder auf das ursprüngliche Objekt zurück context[name] = old_public_api } //; Rückgabe selbst, die vom aufrufenden Code gehalten, gespeichert oder einer Variablen zugewiesen wird. return md5_func }; Das zurückgegebene Objekt wird an einen Namen wie MD5 gebunden, und auf dieses Objekt wird extern verwiesen Es können die Schließungsfunktion, interne Schließungsmethoden und interne Objekte verwendet werden. Lib verwendet diese Abschlussfunktion im Allgemeinen, um private Eigenschaften und Objekte zu verwalten. // Nur einige Methoden (APIs), dh Funktionen, können von außen aufgerufen werden, was die interne Logiksteuerung erleichtert und reduziert Abhängigkeiten. return md5_func;})
Testergebnisse:
md5("1");"c4ca4238a0b923820dcc509a6f75849b"md5(md5("1"))"28c8edde3d61a0411511d3b1866f0636"
4. Oracle Database Edition MD5
HINWEIS: Um mit MD5-Methoden in anderen Umgebungen konsistent zu sein, erfordert die Konvertierung in Kleinbuchstaben die Erstellung einer gespeicherten Funktion:
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;
Testergebnisse:
SQL> wähle MD5('1') als m1, MD5(md5('1')) als m2 aus Dual 2 ;M1--------------------- ----M2------------------------------ - -------c4ca4238a0b923820dcc509a6f75849b28c8edde3d61a0411511d3b1866f0636
PS: Hier sind zwei weitere MD5-Verschlüsselungstools für Sie, auf die sich interessierte Freunde beziehen können:
MD5-Online-Verschlüsselungstool:
http://tools.VeVB.COm/password/CreateMD5Password
Online-Verschlüsselungstools für MD5/Hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160:
http://tools.VeVB.COm/password/hash_md5_sha