MD5, le nom complet est Message Digest Algorithm 5 (cinquième édition de l'algorithme de résumé de message. Pour plus de détails, veuillez vous référer à Wikipedia : MD5).
Le cryptage MD5 est un tableau d'octets, mais nous utilisons généralement sa représentation sous forme de chaîne hexadécimale. Bien entendu, les chaînes hexadécimales sont sensibles à la casse dans les langages MySQL, Java et JavaScript. Généralement, des chaînes minuscules sont utilisées pour les représenter, mais dans les langages MySQL. package officiellement fourni par la base de données Oracle, les chaînes en majuscules sont renvoyées, ce qui est un piège. Si vous souhaitez exécuter md5 plusieurs fois, vous devrez peut-être les convertir en minuscules.
Le code correspondant est le suivant :
1. Java version MD5
MD5Util.java
package com.cncounter.util.common;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * Algorithme de résumé de message Java Classe d'outils MD5, en fait, l'implémentation d'autres algorithmes de résumé est également similaire*/public class MD5Util { / ** * Effectue le cryptage du résumé md5 sur le texte. Cet algorithme a été comparé au résumé md5 généré par mysql et JavaScript. Les lettres dans la valeur de retour sont en minuscules*/ public static String md5(String plainText) { if (null == plainText) { plainText = "" } String MD5Str = "" try { // JDK 6 prend en charge les 6 messages suivants. digests Algorithme, insensible à la casse // md5,sha(sha-1),md2,sha-256,sha-384,sha-512 MessageDigest md = MessageDigest.getInstance("MD5"); md.update(plainText.getBytes()); octet b[] = md.digest(); int StringBuilder builder = new StringBuilder(32); offset < b.length; offset++) { i = b[offset]; si (i < 0) i += 256; builder.append("0"); builder.append(Integer.toHexString(i)); } MD5Str = builder.toString(); // LogUtil.println("result: " + buf.toString());// Cryptage 32 bits} catch (NoSuchAlgorithmException e) { e.printStackTrace( } return MD5Str } // Une version simplifiée du test public; static void main(String[] args) { String m1 = md5("1"); String m2 = md5(m1); /* La sortie est * m1=c4ca4238a0b923820dcc509a6f75849b * m2=28c8edde3d61a0411511d3b1866f0636 */ System.out.println("m1="+m1); System.out.println("m2="+m2 }}
2. MySQL version MD5
MySQL prend directement en charge les appels de fonction md5
sélectionnez md5('1') comme m1, md5(md5('1')) comme m2 ;
Le résultat de l'exécution est :
MariaDB [(aucun)]> sélectionnez md5('1') comme m1, md5(md5('1')) comme m2;+-------------------- ------ ---------------+---------------------------- ------+ m1 | m2 |+------------------------------------ -------- --------------+| 28c8edde3d61a0411511d3b1866f0636 |+----------------------------------+------------ --------- -------------+1 ligne dans l'ensemble (0,00 sec)
3. Version JavaScript de la fonction MD5
Le code md5.js est le suivant :
/*! Implémentation MD5 de JavaScript*/// Les expressions entre crochets, (xxxxx) sont utilisées pour traiter les résultats des instructions et expressions internes comme un seul résultat.// Il est courant d'utiliser eval pour analyser une chaîne json, et eval est requis ("(" +jsonstr+ ")");// () définit un espace en interne, et les variables qui y sont définies ne pollueront pas l'espace global. Il est très approprié pour lib// (fonction UMD (nom de l'objet/de la fonction. , contextualisez ceci, Définition de la fonction/de l'objet)) Renvoie une fonction anonyme // Parce que le résultat dans la première parenthèse est une fonction, et la fonction peut être appelée comme ceci : (function (paramètre formel) {}) (paramètre réel) // Ceci ; genre d'anonyme La fonction sera automatiquement exécutée une fois après avoir été analysée par le navigateur. (function UMD(name, context, definition) { if ( typeof module !== "undefined" && module.exports) { // if module existe et module.exports existe, puis attribuez-lui le résultat de l'affectation // Vous pouvez ignorer module.exports = definition(); } else if ( typeof definition === "function" && definition.amd) { // Si définir Cette fonction existe et devrait être une autre bibliothèque de classes de base, utilisez donc Définir // Vous pouvez ignorer Définir(définition); } else { // Plus simple, cela peut être vu comme : Appelez la fonction de définition passée et liez l'objet renvoyé à l'espace global // Bien sûr, en fonction du contexte passé, il peut également être lié à d'autres objets et devenir une méthode d'attribut context[name] = definition(name, context. ); }})("md5", this, function DEF(name, context) {"use strict"; // L'utilisation stricte ci-dessus indique un mode de syntaxe strict, et l'exécution sera refusée en cas d'erreur. // Le JS ordinaire est interprété et exécuté, mais pas exécuté. Certaines erreurs n'affecteront pas l'exécution d'autres codes. // En tant que bibliothèque de classes, il est nécessaire d'utiliser le mode strict. . Le début. // var old_public_api = (context || {})[name]; // Le dernier objet/fonction à retourner function md5_func(text) { return hex_md5(text); l'algorithme de détails... Vous pouvez le laisser tranquille////////////////////////////////////////// //// /////// //Calculer MD5 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))) }; hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72" }; fonction 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 = Tableau(16), d = Tableau(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)) }; ) { essayer { hexcase } catch(g) { hexcase = 0 } var f = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var b = "" pour (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 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 si (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 | ((une >>> 6) et 63), 128 | (une et 63)) } autre { si (une <= 2097151) { b += String.fromCharCode(240 | ((a >>> 18) & 7), 128 | ((a >>> 12) & 63), 128 | ((a >>> 6) & 63 ), 128 | (a & 63)) } } } } } return b }; fonction rstr2binl(b) { var a = Tableau(b.longueur >> 2); pour (var c = 0; c < a.longueur; c++) { a[c] = 0 } pour (var c = 0; c < b.longueur * 8; c += 8) { a[c >> 5] |= (b.charCodeAt(c / 8) & 255) << (c % 32) } renvoie une fonction }; binl2rstr(b) { var a = ""; pour (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; pour (var g = 0; g < p.longueur; g += 16) { var j = o; var h = n; var f = m; var e = l; 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); m = 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); 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); 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); 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); 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); 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 = safe_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) } fonction; 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, je, h) { return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h) } fonction; md5_hh(g, f, k, j, e, i, h) { return md5_cmn(f ^ k ^ j, g, f, e, i, h) }; , je, 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) ; 65535) }; function bit_rol(a, b) { return (a << b) (a >>> (32 - b)) }; /////////////////////////////////////////////// /// /// // Évitez les conflits d'espace de noms globaux md5_func.noConflict = function publicAPI$noConflict() { if (context) { // Restaurez ce nom à l'objet d'origine context[name] = old_public_api } // Renvoie lui-même, qui est conservé, enregistré ou affecté à une variable par le code appelant return md5_func; }; // L'objet renvoyé sera lié à un nom tel que MD5, et cet objet sera référencé en externe. la fonction de fermeture, les méthodes internes de fermeture et les objets internes peuvent être utilisés. Lib utilise généralement cette fonctionnalité de fermeture pour conserver les propriétés et les objets privés. // N'expose que certaines méthodes (API), c'est-à-dire les fonctions, au monde extérieur. Seules ces API peuvent être appelées de l'extérieur, ce qui facilite le contrôle logique interne et réduit. dépendances. return md5_func;})
Résultats des tests :
md5("1");"c4ca4238a0b923820dcc509a6f75849b"md5(md5("1"))"28c8edde3d61a0411511d3b1866f0636"
4. Édition de base de données Oracle MD5
REMARQUE : Pour être cohérent avec les méthodes MD5 dans d'autres environnements, la conversion en minuscules nécessite la création d'une fonction stockée :
CRÉER OU REMPLACER UNE FONCTION 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))));
Résultats des tests :
SQL> sélectionnez MD5('1') comme m1, MD5(md5('1')) comme m2 à partir du dual 2 ;M1---------------------- ---------M2------------------------------- - -------c4ca4238a0b923820dcc509a6f75849b28c8edde3d61a0411511d3b1866f0636
PS : Voici 2 autres outils de cryptage MD5 pour vous. Les amis intéressés peuvent s'y référer :
Outil de chiffrement en ligne MD5 :
http://tools.VeVB.COm/password/CreateMD5Password
Outils de chiffrement MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160 en ligne :
http://tools.VeVB.COm/password/hash_md5_sha