المستوى المطلوب: مبتدئ. المقال ده مناسب لأي حد بيبني أول تطبيق فيه تسجيل دخول، ومش لازم تكون خبير أمان علشان تطبّقه.
لو بتخزّن كلمة سر المستخدم كنص عادي في قاعدة البيانات، أي تسريب واحد بيسلّم حسابات كل مستخدمينك جاهزة للمهاجم. الحل مش التشفير زي ما ناس كتير فاكرة. الحل هو الهاش. في المقال ده هتعرف الفرق بالظبط، وهتطبّقه بأربع سطور بايثون شغّالة.
المشكلة باختصار
تخيّل قاعدة بيانات فيها عمود اسمه password مكتوب فيه P@ssw0rd! بالنص الصريح. طالما الكلمة مخزّنة كما هي، أي حد يوصل للجدول ده — موظف، أو مهاجم اخترق نسخة احتياطية — بياخد كل الحسابات في ثانية. والأسوأ: أغلب الناس بتعيد استخدام نفس الكلمة، فأنت مش بتسلّم حسابك بس، أنت بتسلّم إيميلهم وبنكهم كمان.
المفهوم بمثال بسيط: البصمة
خلّينا نفهمها بمثال قبل أي تعريف علمي. اعتبر الهاش زي بصمة الإصبع. الشخص الواحد بيدّي دايمًا نفس البصمة بالظبط. لكن مستحيل تاخد بصمة وترجّع منها الشخص نفسه. هي اتجاه واحد.
نظام تسجيل الدخول بيشتغل بنفس الفكرة. وقت ما تعمل حساب، السيرفر بياخد كلمة سرّك، يحسب "بصمتها" (الهاش)، ويخزّن البصمة بس — مش الكلمة. تاني يوم لما تسجّل دخول، بياخد اللي كتبته، يحسب بصمته، ويقارنها بالمخزّنة. لو اتطابقوا، يبقى انت هو. السيرفر عمره ما احتاج يعرف كلمتك الأصلية، وعمره ما خزّنها.
طيب لو اتنين اختاروا نفس الكلمة، مش هتطلع نفس البصمة وتفضح إنهم زي بعض؟ هنا بييجي المِلح (salt): نص عشوائي فريد بيتضاف لكل مستخدم قبل الهاش. فحتى لو الكلمة واحدة، البصمة المخزّنة بتطلع مختلفة تمامًا لكل شخص.
التعريف العلمي الدقيق
دالة الهاش المخصّصة لكلمات السر هي دالة رياضية حتمية (نفس المدخل يدّي نفس المخرج) وأحادية الاتجاه (مفيش خوارزمية عملية ترجّع المدخل من المخرج). خصائصها الأساسية: مقاومة الصورة العكسية (preimage resistance)، ومقاومة التصادم (يصعب توليد مدخلين بنفس الهاش).
وهنا الفرق الجوهري عن التشفير (Encryption): التشفير قابل للعكس بمفتاح. تشفّر Ahmed 2026 تطلع 9f3a-b1، وبنفس المفتاح ترجّعها زي ما كانت. ده مناسب لبيانات محتاج تقراها تاني (رسالة، رقم بطاقة). أما كلمة السر، انت مش محتاج ترجّعها أبدًا — انت محتاج تتأكد بس إن اللي كتبه المستخدم مطابق. عشان كده الهاش هو الصح، مش التشفير.
الكود: هش وتحقّق بأربع سطور
ده مثال شغّال بمكتبة bcrypt في بايثون. ثبّتها بـ pip install bcrypt.
import bcrypt
password = b"P@ssw0rd!"
# وقت التسجيل: هش الكلمة مع مِلح عشوائي (cost = 12)
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))
print(hashed)
# وقت تسجيل الدخول: قارن من غير ما تفك أي حاجة
print(bcrypt.checkpw(b"P@ssw0rd!", hashed)) # True
print(bcrypt.checkpw(b"wrong-pass", hashed)) # False