ما هو التشفير باستخدام توابع Hashing؟ هي عملية توليد رقم أو مفتاح ثابت الطول من مجموعة من البيانات، أياً كان حجمها. ربما كنت تتسائل الآن لماذا لم أقم بترجمة هذا المصطلح وأبقيته على ما هو عليه ؟! الترجمة الحرفية لـ Hashing هي : الفرم أو المزج … وهذا لا يوصل المعنى بشكل كافٍ. إذاً تقوم خوارزمية الهاشينغ بإعادة قيمة من البيانات الممررة … ويتم هذه القيمة تسمى مفتاح أو رقم (بالانجليزية تسمى hash values, hash codes, hash sums, checksums أو hashes) من أهم مزايا هذا المفتاح: طوله ثابت: وذلك من أجل خوارزمية معينة مهما كان حجم البيانات. متفرّد unique: أي لا يمكن أن ينتج نفس المفتاحين من أجل كتلتين مختلفتين من البيانات * غير قابل للعكس: لا يمكنك انطلاقاً من المفتاح الوصول إلى البيانات أبداً، لكن يمكنك معرفة إذا ما كانت البيانات الأصلية متماثلة أم لا بمقارنة المفتاحين. (نظرياً هو غير متفرد، لكن عملياً عندما يكون احتمال تكرار نفس المفتاح قليل جداً جداً جداً ... يمكننها إهمال هذا الاحتمال بكل راحة) استخدامات توابع التشفير باستخدام توابع Hashing: أهمية هذه التوابع كبيرة جداً ولها استخدامات عديدة ومتنوعة بالنسبة للمطورين، وهي قائمة على أساس المزايا والخواص السابقة التي يتمتع بها المفتاح … منها: تشفير كلمات السر: وذلك قبل تخزينها في قاعدة البيانات، وعندما يدخل المستخدم كلمة السر يتم توليد المفتاح من الكلمة المدخلة مرة ثانية ومقارنتها مع الكلمة المخزنة في قاعدة البيانات، وبالتالي تبقى القاعدة آمنة حتى لو تمكن شخص غير مخوّل من الدخول إليها وقراءة كلمات السر. التأكد من صحة نقل البيانات: وذلك بتوليد مفتاح من البيانات قبل نقلها، ثم توليده مرة ثانية بعد نقلها ثم مقارنة المفتاحين. منع التكرار بتوليد مفاتيح متفرّدة: في موقع رفع ملفات مثلاً: يكن أن يتم توليد مفتاح خاص بكل ملف، وإذا قام مستخدم ما برفع ملف له نفس مفتاح ملف موجود مسبقاً، فهذا يعني أن الملف مكرر ولا داعي لتخزينه مرة أخرى وحجز مساحة خاصة له! الخوارزميات الشهيرة: هناك العديد من الخوارزميات هاشينغ الشهيرة والتي تتفاوت فيما بينها بالعديد من الأمور أهمها: طول المفتاح المولد وسرعة أدائها. أهم هذه الخوارزميات بالنسبة للمطور: اسم الخوارزمية : طول المفتاح المولد MD5 : 128bit SHA-1 : 128bit SHA-256 : 256bit SHA-512 : 512bit وهي مرتبة حسب السرعة (تنازلياً) وحسب القوة (تصاعدياً). أمثلة بكل اللغات ! قبل البدء بالأمثلة، يجب التنويه إلى الملاحظات التالية: - التوابع التالية بمختلف اللغات تقوم بحساب المفتاح لسلسة نصية، وبالتالي يصلح استخدامها في تشفير كلمات السر، ومع تعديلات بسيطة يمكن حساب المفاتيح من أجل الملفات أو غيرها من أنواع البيانات - المفتاح الناتج عادة ما يكون على شكل بايتات، ولكن من المتعارف عليه أن يتم عرضها بترميز ست عشري … وهذه التوابع تقوم بذلك - الأمثلة بالطبع لا تغطي كل لغات البرمجة ! لكنها تغطي أهمها. كود جافا Java: تابع تشفير باستخدام Hash لأهم الخوارزميات، مع صف اختبار: PHP: import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Formatter; public class HashingInJava { public static void main(String[] args) { System.out.println(calcHash("سرعة الضوء", "MD5")); System.out.println(calcHash("سرعة الضوء", "SHA-1")); System.out.println(calcHash("سرعة الضوء", "SHA-256")); System.out.println(calcHash("سرعة الضوء", "SHA-512")); } static String calcHash(String content, String algorithm) { try { byte hash[] = MessageDigest.getInstance(algorithm).digest(content.getBytes()); Formatter formatter = new Formatter(); for (byte b : hash) formatter.format("%02x", b); return formatter.toString(); } catch (NoSuchAlgorithmException ex) { } return null; } } كود سي شارب C#: تابع تشفير باستخدام Hash لأهم الخوازرميات PHP: public static string MD5Encrypt(string data, string algorithm) { byte[] result = null; switch (algorithm.ToLower()) { case "md5": result = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(data)); break; case "sha1": result = new SHA1CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(data)); break; case "sha256": result = new SHA256CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(data)); break; case "sha512": result = new SHA512CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(data)); break; } string hex = ""; foreach (byte x in result) { hex += String.Format("{0:x2}", x); } return hex; } كود فيجوال بيزك دوت نيت VB.NET: تابع تشفير باستخدام Hash لأهم الخوازرميات … نفس التابع السابق، لكن بلغة Visual Basic PHP: Function MD5Encrypt(ByVal data As String, ByVal algorithm As String) As String Dim result() As Byte = System.Text.Encoding.Unicode.GetBytes(data) Select Case algorithm.ToLower() Case "md5" result = New Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(result) Case "sha1" result = New Security.Cryptography.SHA1CryptoServiceProvider().ComputeHash(result) Case "sha256" result = New Security.Cryptography.SHA256CryptoServiceProvider().ComputeHash(result) Case "sha512" result = New Security.Cryptography.SHA512CryptoServiceProvider().ComputeHash(result) End Select Dim hex As String = "" For Each b As Byte In result hex += b.ToString("x2") Next Return hex End Function كود بي إتش بي PHP: الأمر أسهل بكثير مع php ، فالتابع موجود بشكل جاهز … كل ما عليك هو استخدامه ! PHP: <?php echo hash('md5', 'سرعة الضوء'); echo hash('sha1', 'سرعة الضوء'); echo hash('sha256', 'سرعة الضوء'); echo hash('sha512', 'سرعة الضوء'); ?> كود C++ مع Qt: مع Qt تابع توليد المفتاح موجود لكنه لا يدعم سوى Md4 و Md5 و Sha1 PHP: QCryptographicHash::hash("سرعة الضوء".toUtf8(), QCryptographicHash::Sha1).toHex(); في أمان الله !