السلام عليكم ورحمة الله وبركاته ،
أهلا بكم إخواني الكرام في درس جديد في الدورة الخاصة بتعلم الحماية ، إن شاء الله في هدا الدرس سنتطرق إلى موضوع الPassword hashing ،
وهو من الأشياء الجد المهمة في الحماية ، فصراحة هناك الكتير من الكلمات السرية التي تتعرض إلى الBrute force بشكل سهل جدا ، وأقصد بالدكر التشفيرات الضعيفة ، كMd5
فحاليا هناك العديد من المواقع التي تكرس كل وقتها في فك هده الشفرات وعمل قاعدة بيانات للكلمات السرية المفككة ولدلك يمكن أن يكون باسوردك ضمن تلك القاعدة ، الأن في هدا الدرس سنشاهد الطريقة التقليدية التي يتم بها التشفير ، واقصد بدلك إستعمال الmd5 ، تم بعدها سنشاهد كيف نستعمل بعض الدوال التي توفرها لنا البي إتش بي بشكل أكثر أمان و أكثر تعقيد ، كملاحظة بخصوص الدوال التي سنستعملها فهناك مرفق للدرس به تلك الدوال وقد قمت بوضع Password Hashing wrapper في نفس الوقت لمبرمجين والمطورين بالبرمجة الكائنية التوجه ، لدلك يمكنكم زيارته لمعلومات أكثر.
الرابط :http://www.startimes.com/f.aspx?t=37084609
الأن نمر للدرس ، نقوم بعمل ملف php عادي كالتالي :

كما ترون فوق عملنا متغير يحمل قيمة الكلمة السرية ، سندعي أنها كلمة سرية أتت من الزائر الدي يريد أن يسجل عضويته بموقعك ، تم نقوم بعمل echo لها ، لندعي أننا نقوم بإدخالها لقاعدة البيانات ، عادةََ نقوم بعمل تشفير لها ، لدلك لنعمل التشفير ، والدي سيكون كالتالي :

الأن نرى النتيجة في المتصفح :

كما ترون تم التشفير بنجاح تام ، الأن كما قلت لكم تشفير md5 يعد من التشفيرات الضعيفة حاليا ويسهل فكه ، لنجرب فك هدا الباسورد في مواقع لفك التشفير ،
ندخل التشفير ونرى النتيجة :

للأسف تم فك التشفير بسهولة تامة يعني في حوالي 223m/s .. هدا يدل على مدى ضعف التشفير للأسف ، الأن عرفنا كيف أن هدا التشفير ضعيف وسهل فكه ، لنرى كيف نقوم بوضع باسوورد جد محمي ، مقارنة مع الmd5 ، سنستعمل في هدا الدرس دالة password_hash ، والتي تقبل تلات بارامترات كالتالي :

الأول يخص الباسوررد المراد التشفيره ، وفي هده الحالة لدينا هو المتغير $password ، بخصوص ال$algo ، إختصارا للوغاريثم ، وهنا في بي إتش بي لدينا فقط إثنتين ، الأول وهو :
PASSWORD_DEFAULT
والثاني هو :
PASSWORD_BCRYPT
بخصوص الأول فالحروف يمكن أن تكون أكثر من 60 حرفا ، لدلك راعوا الأمر في عملية صنع حقل الباسوورد ، اما اللوغاريثم الثانية فتقبل 60 حرفا بالتحديد ،
أما بخصوص البارامتر الثالت ، وهو الأخير فهو الOptions هناك ، إثنين الأول وهو الsalt والدي لن نستعمله ، فقد تم حدفه في php7 والثاني هو الcost ، والدي يدل على مدى صعوبة فك التشفير كلما كان الرقم أكبر كلما كان فك تشفيره أصعب ، ولكنه إن كان الرقم كبيرا يحصل تقل على السكربت .
الأن لنطبق الأمر في سكربتنا ،

نرى النتيجة في المتصفح :

بخصوص السهم في أقصى اليسار يدل على اللوغاريثم التي حددناها ، أقصد بهدا دلك الconst ، الدي إسمه PASSWORD_BCRYPT ،
أما بخصوص السهم الثاني فهو يخص الcost كما ترون تم طباعة 12 ، الأن لنجرب شكل تاني يخص التشفير ، اقصد بهدا PASSWORD_DEFAULT

النتيجة :

جميل ، الأن تعرفنا على طريقة التشفير الأن نمر لطريقة فك التشفير ، نرجع اللوغاريثم كما كانت ، أفضل :

الأن نستعمل دالة أخرى وهي دالة الpassword_verfiy ، اولا لنحتفظ بدلك الهاش الدي قمنا بتشفيره ونضعه في متغير تم نستعمل دالة التحقق والتي هي password_verify ،

الأن لنستعمل الدالة ، الدالة جد بسيطة صراحة ، سوف ترون :

الدالة فوق تقبل بارامترين واحد وهو الباسورد المراد التحقق به ، والبارامتر الثاني وهو الباسورد المشفر ، الدالة ترجع boolean ، ما أقصده بدلك ، إن كان صحيح يرجع true وبدلك يتحقق الشرط ، إن كان خاطئا يرجع false وبدلك لا يتحقق الشرط ، لنرى النتيجة في المتصفح الأن :

كما ترون تم التحقق والرجوع بقيمة true ، ولدلك تحقق الشرط وطبع لنا بأن الباسورد صحيح ، الأن لنغير الباسورد ، كما قلت في بداية الدرس نحن نتوهم بأن الباسورد هو مُدخل من طرف زائر يريد تسجيل الدخول بعضويته مثلا ، لدلك لنجرب أنه أدخل باسورد خاطئ ونرى النتيجة :

الأن نرى النتيجة :

كما ترون لقد تعرف على أن الباسورد خاطئ لدلك أرجع لنا قيمة false وبالتالي لم يتحقق الشرط وطبع لنا أن الكلمة السرية خاطئة ،
إلى هنا إخواني الكرام ينتهي درسنا ، نلتقي في درس أخر إن شاء الله
تــــحياتي اخوكم في الله هشام