لا يمكن "فك تشفير" هاش bcrypt: لمعرفة ما إذا كانت كلمة المرور صحيحة، استخدم وضع التحقق. يتم الحساب كله في متصفحك ولا تُرسل كلمة المرور إلى أي خادم.
الإصدار الحالي. تولّده OpenBSD وNode.js وPython وGo وRust.
كل زيادة بمقدار واحد في التكلفة تضاعف وقت الحساب. توصي OWASP بقيمة 10 على الأقل؛ والأفضل هو أعلى قيمة يستطيع خادمك حسابها في نحو 250 ملّي ثانية.
كيف يعمل
bcrypt دالة تجزئة صُمّمت لتخزين كلمات المرور. على عكس SHA-256 أو MD5 اللذين يُحسبان في أجزاء من الملّي ثانية، فإن bcrypt بطيئة عمدًا: فمن يسرق قاعدة بيانات سيحتاج إلى سنوات لتجربة كلمات المرور بالقوة الغاشمة.
يحتوي كل هاش على كل ما يلزم للتحقق منه: إصدار الخوارزمية والتكلفة وملح عشوائي بطول 128 بت. لذلك تعطي كلمة المرور نفسها هاشًا مختلفًا في كل مرة، ولا حاجة لتخزين الملح بشكل منفصل.
التكلفة هي اللوغاريتم للأساس 2 لعدد الجولات: مع التكلفة 10 تُحسب 1024 جولة ومع 12 تُحسب 4096. زيادة نقطة واحدة تضاعف وقت الحساب، مما يسمح بمواكبة ازدياد قوة العتاد دون تغيير الخوارزمية.
أمثلة
rasmuslerdorf$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1aمثال password_verify() من دليل PHP: الصقه في وضع التحقق مع كلمة المرور هذه وسيتطابق.abc$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0iمتجه اختبار من jBCrypt بتكلفة 6. أول 22 حرفًا بعد التكلفة هي الملح، والـ 31 حرفًا المتبقية هي الناتج.حالات الاستخدام
- إنشاء هاش لكلمة المرور الأولية لمستخدم مسؤول لإدراجه مباشرة في قاعدة البيانات.
- التحقق مما إذا كانت كلمة المرور تطابق الهاش المخزّن عندما يتعذّر على المستخدم تسجيل الدخول.
- توليد هاش تجريبي لبيانات fixtures أو seeds أو للاختبارات الآلية لتطبيق Laravel أو Spring أو Django أو Node.js.
- قياس الوقت الذي تستغرقه كل تكلفة لاختيار القيمة المناسبة قبل ضبطها على الخادم.
- إنشاء إدخالات لملفات .htpasswd في Apache، التي تقبل هاش bcrypt بالبادئة $2y$.
الأسئلة الشائعة
هل يمكن فك تشفير هاش bcrypt؟
لا. bcrypt دالة أحادية الاتجاه: لا توجد طريقة للحصول على كلمة المرور من الهاش. كل ما يمكن فعله هو تجربة كلمات مرور مرشّحة ومعرفة ما إذا كانت إحداها تتطابق، وهذا بالضبط ما تجعله bcrypt بطيئًا.
ما الفرق بين $2a$ و$2b$ و$2y$؟
تحسب الثلاثة النتيجة نفسها لكلمات المرور العادية. $2a$ هو الإصدار الأصلي؛ وقدّمت PHP الإصدار $2y$ في 2011 لتمييز هاشاتها عن هاشات تطبيق كان فيه خطأ؛ واعتمدت OpenBSD الإصدار $2b$ في 2014 عند إصلاح خطأ آخر يخص كلمات المرور التي تتجاوز 255 حرفًا. تقبل جميع المكتبات تقريبًا الثلاثة عند التحقق.
ما التكلفة المناسبة؟
توصي OWASP بقيمة 10 على الأقل. والأفضل هو أعلى قيمة يستطيع خادمك حسابها في نحو 250 ملّي ثانية لكل تسجيل دخول. يستخدم Spring Security القيمة 10 افتراضيًا، بينما رفعت Laravel 11 وPHP 8.4 قيمتهما إلى 12.
لماذا يتجاهل bcrypt ما يتجاوز 72 بايت؟
تستخدم الخوارزمية كلمة المرور كمفتاح Blowfish، الذي يقبل 72 بايت كحد أقصى. ويُحذف الزائد دون تنبيه، لذا تعطي كلمتا مرور تشتركان في أول 72 بايت الهاش نفسه. تشغل الحروف العربية بايتين لكل حرف وقد تشغل الرموز التعبيرية حتى أربعة بايتات، ولهذا تحسب الأداة البايتات لا الأحرف.
أيهما أفضل: bcrypt أم Argon2؟
Argon2id هي الخوارزمية الموصى بها اليوم للأنظمة الجديدة لأنها، إلى جانب بطئها، تستهلك ذاكرة كبيرة، مما يرفع كلفة الهجمات بوحدات GPU. ومع ذلك يبقى bcrypt آمنًا مع تكلفة مناسبة، وهو الافتراضي في PHP وLaravel وSpring وRuby on Rails.
هل تُرسل كلمة المرور الخاصة بي إلى خادم؟
لا. يُحسب الهاش والتحقق في متصفحك ولا تغادر كلمة المرور جهازك أبدًا؛ كما أنها لا تُضمَّن في رابط مشاركة الأداة.