php MySql إنشاء فضاء للأعضاء

كلمة المرور بين التشفير و السرقة

آخر تحيين: 28-07-2014

تشفير كلمة المرور bcrypt استمارات التسجيل و الدخول و الخروج


عندما يقوم الأعضاء بالتسجيل على موقعكم ، فهم يمنحون لكم الثقة بإعطائكم مجموعة من المعلومات الشخصية . تعتبر "كلمة المرور" أشد هذه البيانات حساسية . كمبرمجين ، وجب عليكم إيلاءها عناية خاصة ، و حمايتها حماية صحيحة . لأنه ، يوميا تتم عمليات سرقة حسابات الأشخاص من قواعد البيانات ، باستعمال تقنيات مختلفة مثل "brute-force , dictionnary, rainbow tables, ..." ، سأعطيكم شرحا بسيطا لبعض هذه التقنيات :

  • dictionnary attack : تعتمد هذه التقنية على مكتبة أو ملف يضم أغلب كلمات المرور المتداولة . يقوم المهاجم باستخدام هذه المكتبة عن طريق التجربة و الخطأ إلى أن يجد كلمة المرور المطابقة . هذه الكلمات المتداولة التي تضمها المكتبة ، هي بكل بساطة الكلمات العادية التي يستعملها الكثيرين أثناء إنشاء كلمات مرورهم ، حتى يتمكنوا من تذكرها بسهولة ، كلمات مثل : "iloveu" أو "MySuperPassword" ، إلخ .
  • brute-force attack : تشبه التقنية السابقة مع إضافة هامة ، حيث يمكن للمهاجم تجربة حتى كلمات المرور الغير الموجودة في المكتبة ، مثلا كلمة المرور التالية : "Aa14vB3" يصعب جدا سرقتها عبر تقنية "dictionnary attack" . لكن يسهل إيجادها باستعمال تقنية "brute-force attack" . لأن المهاجم في هذه الحالة سيستخدم برنامجا خاصا يقوم بتجربة جميع الإحتمالات الممكنة للمزج بين الحروف (a-zA-Z) و الأرقام (9-0) .
    لكن لهذه التقنية أيضا حدودها و يتجلى ذلك بالأساس في عامل الوقت . فكلما كانت كلمة المرور أطوَل ، كلما ازداد الوقت المستغرق لإيجادها . لأن البرنامج سيبدأ من تجربة جميع احتمالات كلمة المرور التي يمكن أن تضم مُكوّنا واحدا فقط ثم سيتبعها بتجربة احتمالات مُكونين ثم ثلاثا و أربعا ... إلخ . إذا كانت كلمة مروركم تضم 14 مُكونا مثلا ، سيتطلب من المهاجم انتظار دهر و ربما ترك وصية لذريته لتستطيع إيجاد كلمة مروركم لنرى بعض الأمثلة في هذا الجدول ، سنفترض أن البرنامج المستخدم يمكنه تجربة 15 مليون كلمة في ثانية واحدة . لسوء الحظ ، هذا ممكن
    الوقت المستغرق لإيجاد كلمات المرور عبر تقنية brute-force حسب صعوبتها
    عدد مكونات كلمة المرورمكونات كلمة المرورالوقت المستغرق
    4a-zأقل من ثانية
    4a-zA-Z0-9أقل من 5 ثوان
    6a-zA-Z0-9ساعة واحدة
    6a-zA-Z0-9 زائد الرّموز11 ساعة
    8a-zA-Z0-95 شهور
    8a-zA-Z0-9 زائد الرّموز10 سنوات
    9a-zA-Z0-9 زائد الرّموز1000 سنة

    كما لاحظتم ، يكون من السهل إيجاد كلمات المرور القصيرة بسرعة فائقة . لكن كلما زاد طولها و تنوعت مكوناتها من حروف و أرقام و رموز ، يصبح ذلك مستحيلا .
  • rainbow tables attack : بما أن أغلب االمبرمجين يقومون بتشفير كلمات المرور في تطبيقاتهم ، اعتمدت تقنية "rainbow tables = جداول قوس قزح" ، على جداول جد ضخمة تضم جميع احتمالات كلمات المرور الممكنة و التشفير المطابق لكل منها .
    بما أن طرق التشفير تختلف من مبرمج لآخر ، فإن الجداول أيضا تتفرع حسب نوع التشفير ، إلا أنها تبقى جد جد ضخمة ، أغلبها يتجاوز مئات الجيكابايت (GB) بل ألاف الجيكابايت . كلما ازداد عدد مكونات كلمة المرور و تنوعّت إلا و تضاعف حجم الجدول . توجد مواقع تُتيح تحميل هذه الجداول ، لكن بالمقابل يجب أن يكون لديكم حاسوب بمعنى الكلمة حتّى تتمكنوا من استعمالها . مثلا هذا الموقع : https://www.freerainbowtables.com/en/tables2/ يعرض تحميل جداول قوس قزح لتشفير md5 بحجم (3889 GB) و جداول sha1 بحجم (1480 GB) ...
    بالنسبة للوقت المستغرق ، سنأخذ على سبيل المثال أداة كراك لكلمات المرور يوفرّها هذا الموقع Jhon The Ripper . إذا استعملنا هذه الأداة مثلا على جهاز حاسوب "core 4 CPU (Intel x7550)" يمكن لها تجربة 514 مليون تشفير في ثانية واحدة و هذا يخص معضم تشيفر DES crypt() . بالنسبة لتشفير sha(256) يتم تجربة 200.000 تشفير في ثانية . في هذه الحالة ، لجدول يضم تشفير كلمات مرور بأربع مكونات سيأخذ 3 دقائق لإيجادها .
    لحماية كلمة المرور من تقنية "جداول قوس قزح" يجب أن نضيف لها "حبة الملح" قبل تشفيرها . هذا يفرض على المهاجم أن يستعمل جداول بسعة خيالية . سنتعرف أسفله عن التشفير و حبة الملح .

ماهو التشفير ؟

التشفير هو تحويل نص إلى بيانات رقمية (مفتاح) . حتّى نُخفي النص الأصلي و نُصعب من مأمورية المهاجم لإيجاده .
عملية التشفير تتم بواسطة خوارزميات ، أغلبها دوال جاهزة ، توّفرها لغة php "لهذا لستم مطالبين و لا أنصحكم باستعمال خوارزمياتكم الخاصة" . في المثال أسفله ، أعطيتكم بعض طرق التشفير لنفس كلمة المرور ، حتّى تُكوّنوا فكرة :

<?php
$pass = "myPassword";

md5($pass) = deb1536f480475f7d593219aa1afd74c;
sha1($pass) = 5413ee24723bba2c5a6ba2d0196c78b3ee4628d1;
hash('sha256',$pass) = 76549b827ec46e705fd03831813fa52172338f0dfcbd711ed44b81a96dac51c6;
hash('sha512',$pass) = 450ad03db9395dfccb5e03066fd7f16cfba2b61e23d516373714471459052ec90a9a4bf3a151e600ea8aaed36e3b8c21a3d38ab1705839749d130da4380f1448;
?>

متى نقوم بتشفير كلمة المرور على موقعنا ؟

لنأخذ مثال استمارتي التسجيل و الدّخول :
استمارة التسجيل
  1. يملأ الزائر الإستمارة ، ثم يقوم بإرسالها
  2. إذا كانت المعلومات التي أدخلها صحيحة ، نقوم بتشفير كلمة المرور قبل تخزينها في قاعدة البيانات
استمارة الدخول :
  1. يملأ الزائر استمارة الدخول ثم يرسلها
  2. نقوم بمعالجتها ثم تشفير كلمة المرور التي أرسلها عبر الإستمارة
  3. نستخلص كلمة المرور المشفرة من قاعدة البيانات اعتمادا على إسم العضو
  4. ثم نقوم بمقارنة كلمة المرور المشفرة و المستخلصة من قاعدة البيانات بكلمة المرور المشفرة و التي أرسلها الزائر . إذا كان التشفيران يتطابقان ، يكون العضو قد نجح في ربط الإتصال .
    سنعود لرؤية هذه العمليات بتفصيل في الدّرس القادم .

لتشفير كلمة المرور ، نعتمد على شيئين أساسيين :الوقت المستغرق أثناء التشفير و حبة الملح : salt
1. الوقت المستغرق أثناء التشفير
يختلف الوقت المستغرق أثناء عملية التشفير حسب الخوارزمية المستعملة . كلما كان الوقت المستغرق صغيرا ، إلا و ازداد احتمال إيجاد كلمة المرور الواضحة من طرف المهاجم . لأنه سيتمكن من تجربة أكبر عدد من المحاولات في وقت قصير . لهذا تعتبر بعض الدوال الكلاسيكية مثل : md5, sha1, sha256 ، متجاوزة و لا ينصح باستعمالها ، فهي خوارزميات سريعة التنفيذ . للتأكد من هشاشتها ، لنفترض أننا اعتمدنا على sha1 لتشفير و حماية كلمة المرور :

<?php
$password ='weak-password';
echo sha1($password); // 25618c60e115224d497198a4f425f05b0d7e41bd
?>

أنقلو التشفير الذي حصلنا عليه : 25618c60e115224d497198a4f425f05b0d7e41bd و قوموا بنسخه في الحقل المخصص لذلك على هذا الموقع : Crack Station. ثم أنقروا على زر "crack hashes" . سيتم إيجاد التشفير في أقل من ثانية ، و ستحصلون على كلمة المرور الواضحة و أيضا إسم الخوارزمية التي استعملناها . ستجدون أسفل الحقل مجموعة كبيرة من الدوال التي يمكن إيجاد تشفيرها بسهولة ، إضافة للثلاثة التي ذكرنا سابقا . يستعمل هذا الموقع تقنية "lookup tables" التي تشمل أيضا جداول قوس قزح "Rainbow tables"
2. salt = الملح
حبة الملح ، عبارة عن نص نضيفه إلى كلمة المرور قبل تشفيرها ، مكونات هذا النص تضاف بطريقة عشوائية و مختلفة (random) مع كل كلمة مرور جديدة . يجب الحرص دائما على أن لا نعطي نفس حبة الملح لكلمتي مرور مختلفتين .
بإضافة حبة الملح نجعل الأمر جد صعب على سرقة كلمة المرور باستعمال تقنية جداول قوس قزح . مثال :

$password = 'mypassword';
$salt = 'addanythingyouwanthere';
$hash_pass = md5($salt.$password);

هذه الطريقة صحيحة ، لكنها خطيرة لأنها تحمينا فقط من الإستغلال عبر تقنية rainbow tables ، لكن لن تحمينا من "brute force" بالنسبة لكلمات المرور الضعيفة . لأنه كما رأينا أعلى ، الخوارزميات مثل "sha512, sha256, sha1, md5 , ..." مصممة لتكون أسرع تنفيذا ، لهذا فهي تتيح للمهاجم تجربة عدد كبير من الشيفرات في وقت قصير .
حتى لا ترهقوا أنفسكم بالبحث عن الطرق المثلى لإضافة حبة الملح إلى كلمة المرور قبل تشفيرها . سنستعمل أحدث و أمتن ما توصلت إليه لغة php في حماية كلمة المرور . لهذا أحثكم على أن تدعوا جانبا الطرق الكلاسيكية للتشفير ، لأنها تشكل خطرا عليكم . كذلك لا تحاولوا كتابة خوارزميات من إخراجكم قد تقعون في المطبات و لو كانت لديكم معرفة متواضعة في المجال . بدل ذلك ، أحثّكم على متابعة الدرس الموالي بعناية تامة ، لتشفير كلمة المرور بطريقة آمنة ، و حمايتها حماية صحيحة .