1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

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

Discussion in 'المنتدى التعليمي' started by mannan, 30/3/13.

  1. mannan

    mannan Administrator Staff Member



    [​IMG]


    [​IMG]


    ما هو التشفير باستخدام توابع 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 contentString algorithm) {
    try {
    byte hash[] = MessageDigest.getInstance(algorithm).digest(content.getBytes());
    Formatter formatter = new Formatter();
    for (
    byte b hashformatter.format("%02x"b);
    return 
    formatter.toString();
    } catch (
    NoSuchAlgorithmException ex) {
    }
    return 
    null;
    }
    }  

    كود سي شارب C#:

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



    PHP:
    public static string MD5Encrypt(string datastring 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 StringByVal 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();  



    في أمان الله !


    [​IMG]




     

Share This Page