التشفير باستخدام توابع Hash في كل اللغات !

Posted: 09/10/2010 in برمجة
الوسوم:, , , , , , , , , , , ,

ما هو التشفير باستخدام توابع Hashing؟

التشفير باستخدام Hashaing !هي عملية توليد رقم أو مفتاح ثابت الطول من مجموعة من البيانات، أياً كان حجمها.

ربما كنت تتسائل الآن لماذا لم أقم بترجمة هذا المصطلح وأبقيته على ما هو عليه في مدونة تدّعي الاعتزاز بالعربية؟! الترجمة الحرفية لـ Hashing هي : الفرم أو المزج … وهذا لا يوصل المعنى بشكل كافٍ. إن كان لديك ترجمة أفضل الرجاء أخبرني.

إذاً تقوم خوارزمية الهاشينغ بإعادة قيمة من البيانات الممررة … ويتم هذه القيمة تسمى مفتاح أو رقم (بالانجليزية تسمى hash values, hash codes, hash sums, checksums أو  hashes)

من أهم مزايا هذا المفتاح:

  • طوله ثابت: وذلك من أجل خوارزمية معينة مهما كان حجم البيانات.
  • متفرّد unique: أي لا يمكن أن ينتج نفس المفتاحين من أجل كتلتين مختلفتين من البيانات *
  • غير قابل للعكس: لا يمكنك انطلاقاً من المفتاح الوصول إلى البيانات أبداً، لكن يمكنك معرفة إذا ما كانت البيانات الأصلية متماثلة أم لا بمقارنة المفتاحين.

* (نظرياً هو غير متفرد، لكن عملياً عندما يكون احتمال تكرار نفس المفتاح قليل جداً جداً جداً … يمكننها إهمال هذا الاحتمال بكل راحة)

استخدامات توابع التشفير باستخدام توابع Hashing:

أهمية هذه التوابع كبيرة جداً ولها استخدامات عديدة ومتنوعة بالنسبة للمطورين، وهي قائمة على أساس المزايا والخواص السابقة التي يتمتع بها المفتاح … منها:

  • تشفير كلمات السر: وذلك قبل تخزينها في قاعدة البيانات، وعندما يدخل المستخدم كلمة السر يتم توليد المفتاح من الكلمة المدخلة مرة ثانية ومقارنتها مع الكلمة المخزنة في قاعدة البيانات، وبالتالي تبقى القاعدة آمنة حتى لو تمكن شخص غير مخوّل من الدخول إليها وقراءة كلمات السر.
  • التأكد من صحة نقل البيانات: وذلك بتوليد مفتاح من البيانات قبل نقلها، ثم توليده مرة ثانية بعد نقلها ثم مقارنة المفتاحين.
  • منع التكرار بتوليد مفاتيح متفرّدة: في موقع رفع ملفات مثلاً: يمكن أن يتم توليد مفتاح خاص بكل ملف، وإذا قام مستخدم ما برفع ملف له نفس مفتاح ملف موجود مسبقاً، فهذا يعني أن الملف مكرر ولا داعي لتخزينه مرة أخرى وحجز مساحة خاصة له!

الخوارزميات الشهيرة:

هناك العديد من الخوارزميات هاشينغ الشهيرة والتي تتفاوت فيما بينها بالعديد من الأمور أهمها: طول المفتاح المولد وسرعة أدائها. أهم هذه الخوارزميات بالنسبة للمطور:

اسم الخوارزمية
طول المفتاح المولد
MD5
128bit
SHA-1
128bit
SHA-256
256bit
SHA-512
512bit

وهي مرتبة حسب السرعة (تنازلياً) وحسب القوة (تصاعدياً).

أمثلة بكل اللغات !

قبل البدء بالأمثلة، يجب التنويه إلى الملاحظات التالية:

  • التوابع التالية بمختلف اللغات تقوم بحساب المفتاح لسلسة نصية، وبالتالي يصلح استخدامها في تشفير كلمات السر، ومع تعديلات بسيطة يمكن حساب المفاتيح من أجل الملفات أو غيرها من أنواع البيانات
  • المفتاح الناتج عادة ما يكون على شكل بايتات، ولكن من المتعارف عليه أن يتم عرضها بترميز ست عشري … وهذه التوابع تقوم بذلك
  • الأمثلة بالطبع لا تغطي كل لغات البرمجة ! لكنها تغطي أهمها.

كود جافا Java:

تابع تشفير باستخدام Hash لأهم الخوارزميات، مع صف اختبار:

 

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 لأهم الخوازرميات

 

public static string Encrypt(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

 

Function Encrypt(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
echo hash('md5''سرعة الضوء');
echo hash('sha1''سرعة الضوء');
echo hash('sha256''سرعة الضوء');
echo hash('sha512''سرعة الضوء');
?>

 

كود C++ مع Qt:

مع Qt تابع توليد المفتاح موجود لكنه لا يدعم سوى Md4 و Md5 و Sha1

 

QCryptographicHash::hash("سرعة الضوء".toUtf8(), QCryptographicHash::Sha1).toHex();

 

تعليقات
  1. علاء كتب:

    مقال رائع يا عم حسام
    أين انت يا رجل اشتقنالك في الفريق
    سؤال بالنسبة لكود الجافا
    إلى ماذا ترمز %02x ؟ أو ما الذي تعنيه بالضبط؟
    من أين يمكنني الحصول على implementation له علاقة بالحماية؟

    تحياتي

  2. SOL كتب:

    أهلاً أخي علاء

    والله أنا اشتقت لكم أيضاً … ادع لي بالبركة بالوقت

    بالنسبة لـ “%02x” فهي لتنسيق السلسلة النصية بحيث تعرض البايت على شكل رقم ست عشري من خانتين، بأحرف صغيرة.

    ماذا تقصد بتحقيق (implementation) له علاقة بالحماية ؟ هل تقصد تحقيق لخوارزمية توليد الهاش؟ أم كيف يمكن استخدامها ؟

  3. علاء كتب:

    أقصد أنا أعرف أن هناك JSR عن مواضيع الأمان في الجافا
    لكن هل هناك من قام ببناء الواجهات الخاصة بهذا JSR?
    بمعنى آخر أين أجد هذه الفئة java.security.MessageDigest؟

    تحياتي

  4. SOL كتب:

    هناك تحقيق لهذه الـ JSR (رقم 177) ضمن الـ JDK لذا لست بحاجة إلى شيء خارجي

  5. Hassan كتب:

    يوجد عندى ملف ترخيص برنامج معين
    لعدد مستخدمين معينين حسب ما مكتوب بالملف
    اريد كيفيه تزويد عدد المستخدمين بأستخدام ال hash
    الرجاء ارسال الرد على الايميل

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

شعار وردبرس.كوم

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   /  تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   /  تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   /  تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   /  تغيير )

Connecting to %s