كيف تخزن كلمات المرور بأمان: التجزئة والملح (Hashing & Salting)
هل تساءلت يوماً عن الطريقة المثلى لحفظ كلمات المرور؟ اكتشف لماذا تخزينها كما هي خطير، وكيف تحمي Hashing و Salting بياناتك من الاختراق.
الكارثة: تخزين كلمات المرور كما هي
يُطرح سؤال بسيط في مقابلات العمل يكشف الكثير عن طريقة تفكير المبرمج: كيف ستخزن كلمات المرور في قاعدة البيانات؟
الإجابة الشائعة التي تحمل خطراً كبيراً هي: "سأخزنها كما هي". تخيل أنك تضع مفتاح منزلك تحت سجادة الباب، هل هذا آمن؟
إذا تعرضت قاعدة البيانات للاختراق، ستكون كل كلمات المرور مكشوفة وواضحة للمهاجمين، كأنها مكتوبة على ورقة. هذا يهدد خصوصية وأمان المستخدمين بشكل مباشر، ويفتح الباب أمام مشاكل لا حصر لها.
التشفير (Encryption): خطوة غير كافية
قد يقترح البعض "تشفير" كلمات المرور. هذه خطوة أفضل من تركها مكشوفة، لكنها ليست الحل الكامل الذي نبحث عنه.
التشفير عملية ذات اتجاهين: يمكنك تشفير البيانات، ثم فك تشفيرها لإعادتها إلى أصلها. هذا يعني أن هناك "مفتاحاً" لفك التشفير.
إذا تمكن المهاجم من الوصول إلى هذا المفتاح، فسيكون قادراً على فك تشفير جميع كلمات المرور بسهولة. كأنك أغلقت الباب بقفل، لكنك تركت مفتاح القفل معلقاً بجانبه، هل هذا يحمي شيئاً؟
التجزئة (Hashing): طريق بلا عودة
هنا يأتي دور "التجزئة" (Hashing). هذه العملية مختلفة تماماً، إنها "باتجاه واحد".
تخيل أنك صنعت عصيراً من الفاكهة. بمجرد أن يصبح عصيرًا، يستحيل أن تعيد الفاكهة إلى شكلها الأصلي. التجزئة تعمل بنفس المبدأ: تحول كلمة المرور إلى سلسلة فريدة من الحروف والأرقام، ولا يمكن عكس هذه العملية لاستعادة كلمة المرور الأصلية.
إذا تم اختراق قاعدة البيانات، سيجد المهاجمون فقط هذه السلاسل المجزأة (Hashes)، ولن يتمكنوا من معرفة كلمات المرور الأصلية. هذا يوفر طبقة حماية أساسية. كانت هناك خوارزميات مثل MD5، لكن اليوم نستخدم خوارزميات أقوى بكثير مثل SHA-256.
الملح (Salting): حماية إضافية من الجداول الجاهزة
حتى مع التجزئة، ظهر تحدٍ جديد: "جداول قوس قزح" (Rainbow Tables). هذه جداول ضخمة تحتوي على تجزئات (Hashes) لكلمات مرور شائعة ومعروفة مسبقاً.
إذا كانت كلمة مرور المستخدم بسيطة وشائعة، فقد يكون تجزئتها (Hash) موجوداً في هذه الجداول، مما يسمح للمهاجم بمعرفة الكلمة الأصلية بسهولة.
الحل هو إضافة "الملح" (Salting). الملح عبارة عن سلسلة عشوائية وفريدة من الحروف والأرقام، يتم إضافتها إلى كلمة المرور *قبل* عملية التجزئة.
تخيل أنك تضيف مكوناً سرياً وفريداً لكل وجبة قبل طهيها. حتى لو كانت المكونات الأساسية متشابهة، فإن النكهة النهائية ستكون مختلفة تماماً لكل وجبة. بنفس الطريقة، حتى لو استخدم مستخدمان نفس كلمة المرور، فإن تجزئاتهما (Hashes) ستكون مختلفة تماماً بسبب اختلاف الملح المضاف لكل منهما. يتم تخزين هذا الملح بجانب التجزئة في قاعدة البيانات، وهذا يجعل جداول قوس قزح عديمة الفائدة تماماً.
خوارزميات أقوى: لزيادة الصعوبة
لحماية أكبر، نستخدم خوارزميات تجزئة مصممة خصيصاً لتكون "بطيئة" بطبيعتها، مثل bcrypt، scrypt، و Argon2.
هذه الخوارزميات تتطلب وقتاً وجهداً حسابياً كبيراً لإنشاء التجزئة، وهذا مقصود.
لماذا البطء؟ لأنه يجعل محاولات المهاجمين لتخمين كلمات المرور (Brute-force attacks) بطيئة جداً ومكلفة للغاية، مما يقلل من فرص نجاحهم بشكل كبير. هذه الطريقة تظهر الفرق بين مجرد تخزين البيانات وحماية المستخدمين بجدية.
ماذا يعني هذا لك؟
- لا تخزن كلمات المرور أبداً بشكلها الأصلي في قواعد بياناتك.
- استخدم التجزئة (Hashing) كخطوة أولى، وتأكد من أنها عملية باتجاه واحد.
- أضف الملح (Salting) لكل كلمة مرور قبل تجزئتها لزيادة الأمان والحماية من جداول قوس قزح.
- اختر خوارزميات تجزئة قوية ومصممة لمقاومة الهجمات، مثل bcrypt أو Argon2.

