كثير من الأحيان نجد من يستخدم ال Hashing algorithms كطريقة للتشفير Encyrption وهذا الأمر ليس صحيح (مثلاً استخدام MD5 أو SHA لتشفير البيانات، أو حتى فهم فكرة الHashing على أنها تشفير للبيانات)، فالتشفير يحتاج مفتاح key أو باسورد معين أو حتى بالطرق الكلاسيكية القديمة سوف تحتاج لطريقة معينة (هذه هي الsecret) حتى تسترجع البيانات وهو يعتبر كوسيلة اخفاء المعلومات حتى لا ترى البيانات بشكل الصحيح، بينما الHashing هو وسيلة لحفظ البيانات بشكل غير قابل للاسترجاع ابداً، وبالتالي الفرق كبير بينهم وشتان ما بين تطبيقاتهم، فالتشفير تستطيع استرجاع البيانات باستخدام الطريقة المقابلة لفك التشفير ، بينما الHashing لا يمكنك على الاطلاق.
ال Hashing Function (أو الاسم الرياضي لها One Way Function)
هي دالة تأخذ مدخل بأي طول وتخرج نص له طول معين على حسب الدالة، فسواء كانت MD5 وأجدادها القديمة مثل MD4 ، أو كانت ال SHA بأنواعها SHA1 و SHA2 وحتى ايضاً هناك RIPEMD وهي دالة هاش معروفة ايضاً. الجدول التالي يبين انواع الخوارزميات المختلفة
المدخل هو اي binary data سواء كانت ملف ، باسورد، صورة، Image من القرص الصلب، وبشكل اساسي يمكنك أن تقول اي بيانات continuous/stream digital input
لاحظ اسم الدالة one way function أي أنه لا يمكن الرجوع ابداً من الهاش الناتج واستخراج البيانات الأصلية، وايضاً نظرياً لا يمكن ان تجد بيانات مختلفة لها نفس الهاش.. اخيراً اي تغيير ولو bit واحد في المدخل سوف يؤدي لناتج مختلف تماماً عن ما سبق.
بالنسبة للاستخدامات ، فعملياً تستخدم في عدة أمور:
اختبار التكامل أو عدم حدوث تغيير في البيانات Integrity
فمن خلال الHashing لأي بيانات سوف تحصل على الهاش المخرج، في حال قمت بأخذ الهاش لنفس البيانات يجب أن تحصل على نفس الهاش الناتج، اذا تغير الهاش فهذا يعني أن البيانات قد تغيرت..
مثلاً لدى ملف واريد مراقبته هل تم تغييره أم لأ، فأسهل طريقة أحسب الهاش للملف، وفي اي وقت أخر اقوم بفحص القيمة بما هو مخزن وهكذا سوف أعرف هل تم التغيير عليه أم لأ..
مثال اخر عندما تحمل بعض البرامج من الانترنت سوف تجد بجانب زر التحميل الهاش لذلك الملف حتى بعدما ان تقوم بتحميله يمكنك ان تتأكد من صحة الملف وأنه وصل لك كما في الموقع
البحث Searching
فمثلاً اريد البحث عن الملفات المتشابه في قرص، فأسهل طريقة هي حساب هاش كل ملف، ومعرفة الهاشات المتطابقة وهكذا سوف اعرف ان هذه الملفات متطابقة لأن لها نفس الهاش، والذي نظرياً لا يمكن أن يكون لأي ملفين مختلفين نفس الهاش
هذا يتضمن ال Blacklist Searching مثلاً لدي مجموعه من الملفات (صور مخلة، ملفات منتشره مشتبه بها ) و اريد البحث عنها في قرص معين، سوف احسب الهاش لتلك الملفات وابحث عليها داخل اي وسيط وبالتالي يمكن ايجادها بسرعه.
وايضاً يتضمن ال WhiteList Searching فمثلاً أريد البحث في ملفات في قرص النظام ولكن اريد أن يتجاهل ملفات معينة مثلاً ملفات ال dll الخاصة بالنظام وغيرها من الملفات المعروفة أنها تأتي مع النظام، فسوف احسبها واخزنها في قاعدة بيانات، وبالتالي عندما أبحث و اجد اي ملف له هذا الهاش فسوف اتجاهله لأنه ملف نظام وأنا اعرفه وهذا سيقلل وقت البحث والملفات التي تريد البحث حولها.هذه الطرق تستخدم في بعض برامج مكافحة الفيروسات، فمثلاً هناك ملفات فيروسية تكون معروفه وبالتالي اذا لديك قاعدة بيانات من الهاش لتلك الفيروسات تستطيع ببساطة البحث عنها في القرص ومقارنه اي ملف بالهاش في القاعدة واذا وجدته فهذا يعني انك وجدت فايروس ، طبعاً في الأنتي فابروس هذه ليست الطريقة الوحيدة على ايه حالة
تخزين البيانات بشكل غير قابل للاسترجاع
فكما هو معروف انه يجب تخزين كلمات السر في القاعدة على شكل Hashing والسبب أنه اذا حصل اختراق للقاعدة فسوف يتم جلب كل الباسوردات بسهوله، لذلك كان الأمر كتصعيب للمخترق، وبالتالي اي مستخدم يسجل لديك سوف تخزنه باسورده كهاش، وعندما يسجل دخول سوف تأخذ الباسورد وتحسب الهاش فاذا تطابق مع ما يوجد في القاعدة فسوف تتأكد من صحة الباسورد وبالتالي تسمح له بالدخول
بالنسبة للعيوب أو الهجمات (ما يعرف بكسر الشفرات) فالحاصل أنه لا يتم ذلك ولا توجد اي طريقة لذلك الا من خلال حسابات مسبقة أو وجود تصادم في البيانات:
- Collision attack
- Preimage attack
المشكلة الأولى هي أن بعض الخوارزميات كشفت بها ضعف وبالتالي امكن ايجاد مدخلين مختلفين لهم نفس الهاش ، وهذا يسمى Collision ، وخوارمية ال MD5 اشهر من تعرضت لهذه الهجمة لذلك الأفضل أن تستخدم SHA2 سواء 265 أو حتى 512 بت) وحتى ال SHA-1 قد تعرضت لمثل هذه الهجمات.
احتمال ايجاد اي Collision هو قليل جداً، فمثلاً في ال SHA-1 احتمال ايجاد تصادم واحد يكون بين كل 2 اس 80 رسالة وهو رقم كبير جداً ولا يستطيع ان يقوم به اي جهاز عادي.
اما المشكلة الثانية هي أن منها الفكرة أنه يتم توليد هاشات لأي نصوص سواء كانت عشوائية أو يتم سحبها من اي قاعدة بيانات أو حتى عن طريق عمل crawling على الويب والمنتديات وسحب الtextual information ويمكن أن تكون بدايه للبيانات، وحساب هذه النصوص وما يقابله من الهاش وتخزينها على جداول في قاعدة بيانات ما (هذه الجداول في العادة تسمى Rinbow Tables)، وبالتالي اذا حصلت على هاش معين وصدف انه محسوب من قبل فسوف تجد النص الأصلي له ، ايضاً هناك من يقوم بعملية حساب الهاش بالاستفادة من قدرات المعالجة الحديثة Multi-Cores ويقوم بتوليد الهاشات بكل الcores المتاحة، وهناك من يستخدم ال GPU داخل كرت الشاشه للقيام بذلك ، وهناك من يقوم بالعملية على Distributed Systems وفي النهايه كلهم يقوموا بالتخزين على أمل ان يصدف الهاش بها، ولكن اذا كانت كلمة المرور معقدة فسوف يصعب ذلك
خاتمة
هناك من يقومو قبل تخزين الهاش باضافه نص اخر عليه Salt وبالتالي اذا حصل أن المخترق وصل لقاعدة البيانات فحتى لو كان المستخدم باسورده هو 123 والذي يسهل استرجاع النص الأصلي من الهاش المخزن فسوف يصعب على المخترق بسبب أن الsalt اضيف لذلك الباسورد وبالتالي اذا كان الsalt صعب ايضاً فقد لا يتم ايجاد النص الأصلي لكلمة المرور السهله هذه، ولكن في النهايه ال salt يجب ان يخزن في مكان ما ، سواء في القاعدة أو داخل الكود أو في مكان ما المهم ان يكون الكود قادراً على استرجاعه بسهولة وبسرعه ، ربما بعض ال Obufscation يصعب على المخترق في هذا الأمر
آمل أن تكون المقالة الصغيرة قد افادتك وبينت لك فوائد ال Hashing، ولو لاحظت أن تطبيقاتها كثيرة خصوصاً في مجال التحقيق الجنائي forensics وفي البحث عن البيانات، فيمكنك بسهولة الان القيام ببضعه تطبيقات صغيرة والتي عرضنا افكارها في المقالة
مقالة جيدة أشكرك أخي على هذا الشرح الجميل و المختصر
هذه المقالة أضافت لمعلوماتي الشيء الكثير شكرًا لك
مقالة مفيدة جداً شكراً لكم
very good article
شكراا على المعلومات القيمة
شكرااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااا
مقالة رائعة جدا ومفيدة شكرا جزيلا
بارك الله فيك أخي الكريم
thanks
مقال أكثر من رائع
شكرا عزيزي الكاتب زادك الله من فضله وعلمه
مختصر ورائع