الـ Hashing: إزاي نحفَظ الباسورد صح

جارٍ التحميل…

01 / ملخص الدرس

الـ Hashing: إزاي نحفَظ الباسورد صح

يعني إيه Hash، وليه مابيرجعش، و MD5 و SHA256، والـ Salt، وإزاي المهاجم بيكسر الـ hashes الضعيفة بـ wordlist.

02 / شرح الدرس مكتوبًا

نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.

أهلاً بيك. في درس تطبيق الويب، شفنا باسوردات متخزّنة زي ما هي. النهاردة هنصلّح الغلطة دي… بحاجة اسمها Hashing.

الـ Hash ده زي بصمة الصباع للبيانات. تدّي الـ function أي كلام، ترجّع لك نص طوله تابت. نفس الكلام دايماً يدّي نفس الـ Hash. تغيير حرف واحد يغيّر الـ Hash كله. ومفيش طريقة ترجّع من الـ Hash للكلام الأصلي. نجرب: نعمل SHA256 لـ pass123، و pass124. الفرق حرف واحد بس. نشغّل… شوف الاتنين مختلفين خالص.

main.py
import hashlib

print(hashlib.sha256(b"pass123").hexdigest())
print(hashlib.sha256(b"pass124").hexdigest())

المخرجات

9b8769a4a742959a2d0298c36fb70623f2dfacda8436237df08d8dfd5b37374c
67da66db02bbd90735c73e948bd5b8222a60a884554b217eb066f89b70c264e8

طيب لو الـ Hash مابيرجعش، الموقع هيعرف الباسورد صح إزاي؟ بسيطة: بيحفَظ الـ Hash بس. ولما تعمل login، بيعمل Hash للي إنت كتبته، ويقارن الـ Hash بالـ Hash. نشغّل…

main.py
import hashlib

stored = hashlib.sha256(b"pass123").hexdigest()

def login(password):
    return hashlib.sha256(password.encode()).hexdigest() == stored

print(login("pass123"))
print(login("wrong"))

المخرجات

True
False

بس فيه مشكلة. الناس بتستخدم باسوردات سهلة ومشهورة. فالمهاجم بياخد list فيها ملايين الباسوردات المشهورة، اسمها wordlist، ويعمل لكل واحد Hash، ويقارن. وده اسمه Dictionary Attack. نتخيل إن MD5 hash اتسرّب من قاعدة بيانات. نجرّب عليه wordlist صغيرة. نشغّل… لقيناه. وأدوات زي Hashcat و John بتعمل ده بمليارات المحاولات في الثانْيَة.

main.py
import hashlib

leaked = hashlib.md5(b"letmein").hexdigest()
wordlist = ["123456", "password", "letmein", "qwerty"]

for word in wordlist:
    if hashlib.md5(word.encode()).hexdigest() == leaked:
        print("found:", word)

المخرجات

found: letmein

طب الحماية إيه؟ ما تستخدمش MD5 أو SHA1 للباسوردات، دول سريعين قوي وضعاف. ضيف Salt، يعني كلام عشوائي مختلف لكل user قبل الـ Hash. واستخدم خوارزميات بطيئة مخصوص للباسوردات، زي bcrypt أو Argon2. دورك: ضيف كلمة dragon للـ wordlist، وغيّر الـ leaked hash يبقى hash لـ dragon، وشوف هتلاقيه ولا لأ.

تمرين

خلّي leaked = md5 بتاع "dragon" وضيف "dragon" للـ wordlist.

الحل: نشغّل…

main.py
import hashlib

leaked = hashlib.md5(b"dragon").hexdigest()
wordlist = ["123456", "password", "letmein", "qwerty", "dragon"]

for word in wordlist:
    if hashlib.md5(word.encode()).hexdigest() == leaked:
        print("found:", word)

المخرجات

found: dragon

الدرس الجاي: لو عايزين نرجّع البيانات تاني؟ ساعتها مش Hashing… ده Encryption. يلا بينا.

03 / دروس المسار (23)
  1. 01أهلاً بيك — يعني إيه أمن سيبراني؟
  2. 02الكمبيوتر بيشتغل إزاي من جُوّه؟
  3. 03نظام التشغيل: المدير اللي بيدير كل حاجة
  4. 04الملفات والـ Users والصلاحيات
  5. 05صفر وواحد: Binary و Hex و Encoding
  6. 06الشبكات والـ IP Address
  7. 07الـ Ports والـ Protocols
  8. 08الـ DNS والـ HTTP: إزاي الموقع بيفتح؟
  9. 09تطبيق الويب: Client و Server و Database
  10. 10مفاهيم الحماية: CIA Triad
  11. 11Vulnerability و Threat و Risk
  12. 12Authentication و Authorization
  13. 13Least Privilege و Defense in Depth
  14. 14الـ Hashing: إزاي نحفَظ الباسورد صحانت هنا
  15. 15الـ Encryption: Symmetric و Asymmetric و HTTPS
  16. 16تفكير المهاجم: الثقة والمدخلات
  17. 17الـ Attack Surface والـ Attack Vectors
  18. 18الـ Social Engineering والـ Phishing
  19. 19أنواع المهاجمين، والأخلاق، والقانون
  20. 20أنواع الاختبار والـ Scope والـ Rules of Engagement
  21. 21مراحل اختبار الاختراق
  22. 22جهّز الـ Lab بتاعك
  23. 23مراجعة نهائية: سيناريو كامل، وإنت رايح فين