Bcrypt في PHP: كيفية تجزئة كلمات المرور بسرعة وبدون أخطاء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

Bcrypt في PHP: كيفية تجزئة كلمات المرور بسرعة وبدون أخطاء

\n\n

هل تساءلت يومًا لماذا موقعك على PHP يتباطأ عند تسجيل المستخدمين؟ أو الأسوأ من ذلك، لماذا لا يزال المخترقون يتمكنون من سرقة كلمات المرور من قاعدة البيانات الخاصة بك؟ قد تكمن الإجابة في كيفية استخدامك لـ bcrypt لتجزئة كلمات المرور في PHP.

\n\n

هذا السؤال هو واحد من أكثر الأسئلة شيوعًا على Stack Overflow (آلاف المشاهدات!). وليس من المستغرب: أمان كلمات المرور هو الموضوع الذي يمكن لخطأ واحد فيه أن يكلفك سمعتك، والمستخدمين بياناتهم. لكن اليوم لن نكتفي بشرح كيفية استخدام password_hash مع bcrypt. سنتحدث عن التحسين والأداء. لأنه، كما توافقون، الانتظار لمدة 5 ثوانٍ عند تسجيل الدخول ليس أمرًا جيدًا.

\n\n

دعنا نفهم كيف نجعل تجزئة كلمات المرور في PHP ليس فقط آمنة، بل سريعة أيضًا. هيا بنا!

\n\n

لماذا bcrypt؟ ولماذا ليس MD5 أو SHA؟

\n\n

لا يزال العديد من المبتدئين (وللأسف، بعض "المخضرمين") يستخدمون md5() أو sha1(). هذا مثل إغلاق الباب بمزلاج بلاستيكي - يبدو مغلقًا، لكن يكفي أن تنفخ عليه ليفتح. MD5 و SHA هما تجزئات سريعة. سريعة جدًا. يمكن للمخترق باستخدام GPU حديث أن يجرب مليارات من هذه التجزئات في الثانية.

\n\n

Bcrypt هو نهج مختلف جوهريًا. لقد تم تصميمه ليكون بطيئًا عن قصد. يستخدم "ملحًا" (بيانات عشوائية) و "عامل تكلفة" (cost factor) يجبر الخوارزمية على العمل لفترة أطول. بينما يحسب المخترق تجزئة bcrypt واحدة، كان بإمكانه تجربة مليون تجزئة MD5. لهذا السبب يعتبر bcrypt المعيار الفعلي لـ PHP.

\n\n

الأساسيات: كيفية استخدام bcrypt في PHP بشكل صحيح

\n\n

بدءًا من PHP 5.5، لدينا الدالة السحرية password_hash(). انسَ الإضافة اليدوية للملح واستدعاء crypt() - كل شيء تم إنجازه من أجلك.

\n\n

إليك كيف تبدو تجزئة كلمة المرور الصحيحة باستخدام bcrypt:

\n\n
<?php\n// تجزئة كلمة المرور\n$password = 'MySuperSecretPassword123!';\n$hash = password_hash($password, PASSWORD_BCRYPT);\n\necho $hash;\n// الإخراج: $2y$10$... (سلسلة بطول 60 حرفًا)\n?>
\n\n

هذا كل شيء! تقوم password_hash بتوليد ملح عشوائي بنفسها وتختار عامل التكلفة الأمثل (الافتراضي هو 10). ولكن كيف تتحقق من كلمة المرور عند تسجيل الدخول؟

\n\n
<?php\n// التحقق من كلمة المرور\n$inputPassword = 'MySuperSecretPassword123!';\n$hashFromDB = '$2y$10$...'; // نفس التجزئة من قاعدة البيانات\n\nif (password_verify($inputPassword, $hashFromDB)) {\n    echo "كلمة المرور صحيحة! مرحبًا بك.";\n} else {\n    echo "كلمة مرور خاطئة. حاول مرة أخرى.";\n}\n?>
\n\n

بسيط، أليس كذلك؟ لكن الشيطان، كما هو الحال دائمًا، يكمن في التفاصيل. دعنا نتحدث عن الأهم - الأداء.

\n\n

تحسين bcrypt: كيفية إيجاد التوازن بين الأمان والسرعة

\n\n

المعامل الرئيسي الذي يؤثر على أداء bcrypt في PHP هو عامل التكلفة (cost factor). يتم تعيينه كوسيط ثانٍ في password_hash() كمصفوفة ['cost' => 12].

\n\n

ما هو cost؟ إنه مقياس لوغاريتمي. كل وحدة تزيد وقت التنفيذ بمقدار الضعف تقريبًا.

\n\n
    \n
  • Cost = 10 (الافتراضي): ~0.1-0.2 ثانية. سريع، لكنه قليل جدًا لعام 2024.
  • \n
  • Cost = 12: ~0.4-0.8 ثانية. توازن جيد لمعظم المشاريع.
  • \n
  • Cost = 14: ~1.5-3 ثوانٍ. آمن جدًا، لكن المستخدمين سيبدأون في التوتر.
  • \n
  • Cost = 16+: >5 ثوانٍ. فقط إذا كنت جاسوسًا أو تخزن رموزًا نووية.
  • \n
\n\n

كيف تختار cost المثالي؟ هناك قاعدة بسيطة: على خادمك، يجب ألا تستغرق تجزئة كلمة مرور واحدة أكثر من 250-500 مللي ثانية. هذا غير ملحوظ للمستخدم، لكنه يجعل هجوم التخمين مكلفًا جدًا للمخترق.

\n\n

اختبار الأداء

المدونات

توصيات الكتب