MD5، الاسم الكامل هو خوارزمية ملخص الرسائل 5 (الإصدار الخامس من خوارزمية ملخص الرسائل) لمزيد من التفاصيل، يرجى الرجوع إلى ويكيبيديا: MD5
تشفير MD5 عبارة عن مصفوفة بايت، لكننا نستخدم بشكل عام تمثيل السلسلة السداسية العشرية. بالطبع، السلاسل السداسية العشرية حساسة لحالة الأحرف في قاعدة بيانات MySQL ولغات Java وJavaScript، بشكل عام، يتم استخدام السلاسل الصغيرة لتمثيلها. الحزمة المقدمة رسميًا من قاعدة بيانات Oracle، يتم إرجاع السلاسل الكبيرة، وهو أمر مأزق إذا كنت تريد تنفيذ md5 عدة مرات، فقد تحتاج إلى التحويل إلى أحرف صغيرة.
الكود ذو الصلة هو كما يلي:
1. نسخة جافا MD5
MD5Util.java
package com.cncounter.util.common;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * فئة أداة خوارزمية ملخص رسائل Java MD5، في الواقع، تنفيذ خوارزميات الملخص الأخرى مشابه أيضًا*/public class MD5Util { / ** * تنفيذ تشفير ملخص md5 على النص. تمت مقارنة هذه الخوارزمية بملخص md5 الذي تم إنشاؤه بواسطة mysql وJavaScript الأحرف الموجودة في القيمة المرجعة صغيرة*/ public static String md5(String plainText) { if (null == plainText) { plainText = ""; String MD5Str = ""; حاول { // JDK 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(); إزاحة < b. length++) { i = b[offset]; 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"); System.out.println("m1="+m1);
2. إصدار MySQL MD5
يدعم MySQL بشكل مباشر استدعاءات وظائف md5
حدد md5('1') كـ m1، وmd5(md5('1')) كـ m2؛
نتيجة التنفيذ هي:
MariaDB [(none)]> حدد md5('1') كـ m1، md5(md5('1')) كـ m2;+--------------------- ------ ---------------+--------------------------- ------+ |.م1 |.م2 |+---------------------------------+-- -------- ------------------------+|. 28c8edde3d61a0411511d3b1866f0636 |+----------------------------------+------------ --------- -----------------------+ صف واحد في المجموعة (0.00 ثانية)
3. نسخة جافا سكريبت من وظيفة MD5
رمز md5.js هو كما يلي:
/*! تطبيق MD5 لجافا سكريبت*/// تُستخدم تعبيرات الأقواس (xxxxx) لمعالجة نتائج البيانات والتعبيرات الداخلية كنتيجة واحدة.// من الشائع استخدام eval لتحليل سلسلة json، ويكون التقييم مطلوبًا ("(" +jsonstr+ ")");// () يحدد مساحة داخليًا، ولن تلوث المتغيرات المحددة فيها المساحة العامة، وهو مناسب جدًا لـ lib// (وظيفة UMD(object/function name name ، سياق هذا، تعريف الوظيفة/الكائن)) تُرجع دالة مجهولة // لأن النتيجة في القوس الأول هي دالة، ويمكن استدعاء الدالة على النحو التالي: (function (formalparameter) {}) (actualparameter) // This نوع مجهول سيتم تنفيذ الوظيفة تلقائيًا مرة واحدة بعد تحليلها بواسطة المتصفح (function UMD(name, context, Definition) { if (typeof Module !== "undef" && Module.exports) { // if Module موجود، وmodule.exports موجود، ثم قم بتعيين نتيجة التعيين إليه // يمكنك تجاهل Module.exports = Definition(); } else if (typeofdef === "function" &&define.amd) { // إذا حددت هذه الوظيفة موجودة ويجب أن تكون مكتبة فئة أساسية أخرى، لذا استخدم تعريف // يمكنك تجاهل تعريف (تعريف) } else { // أبسط، يمكن رؤيتها على النحو التالي: استدعاء وظيفة التعريف التي تم تمريرها وربط الكائن الذي تم إرجاعه بالمساحة العامة // بالطبع، اعتمادًا على السياق الذي تم تمريره، يمكن أيضًا ربطه بكائنات أخرى ويصبح طريقة سمة context[name] = Definition(name, context }})("md5"، this، function DEF(name, context) {"use الصارم"; // يشير الاستخدام أعلاه الصارم إلى وضع بناء الجملة الصارم، وسيتم رفض التنفيذ في حالة وجود خطأ. // يتم تفسير وتنفيذ JS العادي، ولكن لن تؤثر بعض الأخطاء على تنفيذ الرموز الأخرى // كمكتبة فئة، يجب وضع إعلان الوضع الصارم في بداية مساحة الاسم البداية // var old_public_api = (context || {})[name]; // الكائن/الوظيفة الأخيرة التي سيتم إرجاعها خوارزمية التفاصيل... يمكنك ترك الأمر بمفرده/////////////////////////////////////////////// //// /////// // احسب 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))) }; function md5_vm_test() { return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72" }; function 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; ^ 1549556828 } var g = binl_md5(a.concat(rstr2binl(f)), 512 + f.length * 8); return binl2rstr(binl_md5(d.concat(g), 512 + 128)) }; ) { حاول { hexcase } Catch(g) { hexcase = 0 } var f = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var b = ""; for (var d = 0; d < c.length; d++) { a = c.charCodeAt(d); = f.charAt((أ >>> 4) & 15) + f.charAt(a & 15) } return b }; function str2rstr_utf8(c) { var b = ""; var a, e; while (++d < c. length) { a = c.charCodeAt(d); e = d + 1 < c.length ? c.charCodeAt(d + 1) : 0; && 56320 <= e && e <= 57343) { a = 65536 + ((a & 1023) << 10) + (e & 1023 } if (a <= 127) { b += String.fromCharCode( أ) } else { if (a <= 2047) { b += String.fromCharCode(192 | ((أ >>> 6) & 31)، 128 | (أ & 63)) } else { if (a <= 65535) { b += String.fromCharCode(224 | ((a >>> 12) & 15 ), 128 |. ((أ >>> 6) & 63), 128 | (أ & 63)) } آخر { إذا (أ <= 2097151) { b += String.fromCharCode(240 | ((أ >>> 18) & 7), 128 | ((أ >>> 12) & 63), 128 | ((أ >>> 6) & 63 ), 128 | (أ & 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 }; binl2rstr(b) { var a = ""; for (var c = 0; c < b.length * 32; c += 8) { a += String.fromCharCode((b[c >> 5] >>> (ج % 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 g = 0; g < p.length; g += 16) { var j = o; var h = n; 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); ، م، ل، ص[ز + 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); (ن، م، ل، س، ص[ز + 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); 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); ن، ص[ز + 11]، 14، 643717713)؛ ن = md5_gg(ن، م، l, o, p[g + 0], 20, -373897302); o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691); ن، م، ص[ز + 10]، 9، 38016083)؛ م = md5_gg(م, ل, o, n, p[g + 15], 14, -660478335); n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848); م، ل، ص[ز + 9]، 5، 568446438)؛ ل = md5_gg(ل، o, n, m, p[g + 14], 9, -1019803690); m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961); م، ل، س، ص[ز + 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 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); ل = md5_hh(ل، س، ن، م، ص[ز + 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); l = md5_hh(l, o, n, m ، ص[ز + 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); (س، ن، م، ل، ص[ز + 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)؛ م = md5_ii(م، ل، س، ن، ص[ز + 14]، 15، -1416354905)؛ n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055); o = md5_ii(o, n, m, l, ص[ز + 12]، 6، 1700485571)؛ ل = md5_ii(ل، س، n, m, p[g + 3], 10, -1894986606); m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523); ل، س، ص[ز + 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); (م، ل، س، ن، ص[ز + 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); n = md5_ii(n, m, l, o, p[g + 9); ], 21, -343485551); o =safe_add(o, j); Safe_add(n, h); m =safe_add(m, f); , f) { returnsafe_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) }; الدالة md5_ii(g, f, k, j, e , i, h) { return md5_cmn(k ^ (f | (~j)), g, f, e, i, h) }; فار ج = (أ & 65535) + (د & 65535)؛ فار ب = (أ >> 16) + (د >> 16) + (ج >> 16)؛ العودة (ب << 16) |. 65535) }; function bit_rol(a, b) { return (a << b) |.(a >>> (32 - b)) }; ////////////////////////////////////////////////////////////////// /// /// // تجنب تعارض مساحة الاسم العالمية md5_func.noConflict = function publicAPI$noConflict() { if (context) { // استعادة هذا الاسم مرة أخرى إلى الكائن الأصلي context[name] = old_public_api } // إرجاع نفسه، والذي يتم الاحتفاظ به أو حفظه أو تعيينه لمتغير بواسطة رمز الاتصال return md5_func }; // سيتم ربط الكائن الذي تم إرجاعه باسم مثل MD5، وسيتم الرجوع إلى هذا الكائن خارجيًا يمكن استخدام ميزة الإغلاق وطرق الإغلاق الداخلية والكائنات الداخلية. يستخدم Lib بشكل عام ميزة الإغلاق هذه للحفاظ على الخصائص والكائنات الخاصة. // يعرض فقط بعض الأساليب (API)، أي الوظائف، للعالم الخارجي، ويمكن استدعاء واجهات برمجة التطبيقات هذه فقط من الخارج، مما يسهل التحكم المنطقي الداخلي ويقلل من عدد العمليات التبعيات العودة md5_func؛})
نتائج الاختبار:
md5("1");"c4ca4238a0b923820dcc509a6f75849b"md5(md5("1"))"28c8edde3d61a0411511d3b1866f0636"
4. إصدار قاعدة بيانات أوراكل MD5
ملاحظة: لكي يكون التحويل متسقًا مع أساليب MD5 في بيئات أخرى، يتطلب التحويل إلى أحرف صغيرة إنشاء دالة مخزنة:
إنشاء أو استبدال الدالة 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))));
نتائج الاختبار:
SQL> حدد MD5('1') كـ m1، MD5(md5('1')) كـ m2 من ثنائي 2؛M1----------------------- ------------------M2------------------------------ - -------c4ca4238a0b923820dcc509a6f75849b28c8edde3d61a0411511d3b1866f0636
ملاحظة: إليك أداتين إضافيتين لتشفير MD5، ويمكن للأصدقاء المهتمين الرجوع إليهما:
أداة التشفير عبر الإنترنت MD5:
http://tools.VeVB.COm/password/CreateMD5Password
أدوات التشفير MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160 عبر الإنترنت:
http://tools.VeVB.COm/password/hash_md5_sha