الـ Hashing: إزاي نحفَظ الباسورد صح
يعني إيه Hash، وليه مابيرجعش، و MD5 و SHA256، والـ Salt، وإزاي المهاجم بيكسر الـ hashes الضعيفة بـ wordlist.
نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.
أهلاً بيك. في درس تطبيق الويب، شفنا باسوردات متخزّنة زي ما هي. النهاردة هنصلّح الغلطة دي… بحاجة اسمها Hashing.
الـ Hash ده زي بصمة الصباع للبيانات. تدّي الـ function أي كلام، ترجّع لك نص طوله تابت. نفس الكلام دايماً يدّي نفس الـ Hash. تغيير حرف واحد يغيّر الـ Hash كله. ومفيش طريقة ترجّع من الـ Hash للكلام الأصلي. نجرب: نعمل SHA256 لـ pass123، و pass124. الفرق حرف واحد بس. نشغّل… شوف الاتنين مختلفين خالص.
import hashlib
print(hashlib.sha256(b"pass123").hexdigest())
print(hashlib.sha256(b"pass124").hexdigest())المخرجات
9b8769a4a742959a2d0298c36fb70623f2dfacda8436237df08d8dfd5b37374c 67da66db02bbd90735c73e948bd5b8222a60a884554b217eb066f89b70c264e8
طيب لو الـ Hash مابيرجعش، الموقع هيعرف الباسورد صح إزاي؟ بسيطة: بيحفَظ الـ Hash بس. ولما تعمل login، بيعمل Hash للي إنت كتبته، ويقارن الـ Hash بالـ Hash. نشغّل…
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 بتعمل ده بمليارات المحاولات في الثانْيَة.
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.
الحل: نشغّل…
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)
- 01أهلاً بيك — يعني إيه أمن سيبراني؟
- 02الكمبيوتر بيشتغل إزاي من جُوّه؟
- 03نظام التشغيل: المدير اللي بيدير كل حاجة
- 04الملفات والـ Users والصلاحيات
- 05صفر وواحد: Binary و Hex و Encoding
- 06الشبكات والـ IP Address
- 07الـ Ports والـ Protocols
- 08الـ DNS والـ HTTP: إزاي الموقع بيفتح؟
- 09تطبيق الويب: Client و Server و Database
- 10مفاهيم الحماية: CIA Triad
- 11Vulnerability و Threat و Risk
- 12Authentication و Authorization
- 13Least Privilege و Defense in Depth
- 14الـ Hashing: إزاي نحفَظ الباسورد صحانت هنا
- 15الـ Encryption: Symmetric و Asymmetric و HTTPS
- 16تفكير المهاجم: الثقة والمدخلات
- 17الـ Attack Surface والـ Attack Vectors
- 18الـ Social Engineering والـ Phishing
- 19أنواع المهاجمين، والأخلاق، والقانون
- 20أنواع الاختبار والـ Scope والـ Rules of Engagement
- 21مراحل اختبار الاختراق
- 22جهّز الـ Lab بتاعك
- 23مراجعة نهائية: سيناريو كامل، وإنت رايح فين