Utilia

مولّد Bcrypt ومدقّقه

ولّد هاش bcrypt بمعامل كلفة من 4 إلى 14، وتحقّق من كلمة مرور مقابل هاش موجود، واعرض إصداره وكلفته وملحه وناتجه.

تجزئة كلمة مرور

التحقق من كلمة مرور مقابل هاش

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

  1. في قسم تجزئة كلمة مرور، اكتب كلمة المرور. يعرض عدّاد طولها بالبايت في ترميز UTF-8، وينبّهك عندما تتجاوز 72 بايت.
  2. اختر معامل الكلفة (4–14). يعرض السطر أسفله عدد الجولات، مثلًا 10 ← 2^10 = 1,024 جولة.
  3. انقر توليد الهاش. يتابع شريط التقدّم العمل، وتبقى الصفحة قابلة للاستخدام أثناء التنفيذ. وعند الانتهاء، تعرض الأداة الوقت المستغرق وهاش Bcrypt جاهزًا للنسخ.
  4. يُقسَّم الهاش إلى أجزائه: الإصدار، والكلفة، والملح (22 حرفًا)، والهاش (31 حرفًا).

لـ التحقق من كلمة مرور مقابل هاش، اكتب كلمة المرور، والصق الهاش (يُملأ تلقائيًا بالهاش الذي ولّدته للتو)، ثم انقر تحقّق من كلمة المرور. تخبرك النتيجة إن كانا متطابقين. وفعّل إخفاء كلمات المرور لإخفاء محتوى حقلي كلمة المرور.

تجري التجزئة في متصفحك بمكتبة bcryptjs، التي لا تُحمَّل إلا عند أول حاجة إليها. لا تُرسل أي كلمة مرور أو هاش إلى أي مكان.

كيف يعمل bcrypt

bcrypt (بروفوس ومازيير، 1999) دالة لتجزئة كلمات المرور مبنية على خوارزمية التشفير Blowfish. وعلى عكس SHA-256، فهي بطيئة عمدًا، وبطؤها قابل للضبط: معامل الكلفة أسٌّ للعدد 2، فكل زيادة بمقدار 1 تضاعف العمل. الكلفة 10 تعني 1,024 تكرارًا لعملية إعداد المفتاح المكلفة، والكلفة 12 تعني 4,096. هذا البطء لا يكاد يُلاحظ عند تسجيل دخول المستخدم، لكنه يجعل كسر قاعدة بيانات مسروقة بالقوة الغاشمة أعلى كلفة بكثير.

يُقرأ هاش مثل $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy على النحو التالي:

  • $2b$: الإصدار. الإصداران $2a$ و$2y$ (في PHP) متوافقان ويمكن التحقق منهما هنا؛ أما $2x$ فيدلّ على هاشات من تطبيق قديم معيب، ولذلك يُرفض.
  • 10: معامل الكلفة.
  • الأحرف الـ 22 التالية: ملح عشوائي بطول 128 بت، بأبجدية Base64 الخاصة بـ bcrypt (./A-Za-z0-9).
  • الأحرف الـ 31 الأخيرة: الناتج بطول 184 بت.

ولأن الملح عشوائي ومحفوظ داخل الهاش، فإن تجزئة كلمة المرور نفسها مرتين تعطي هاشين مختلفين، ويتحقق كلاهما بشكل صحيح. ولهذا أيضًا تتحقق من كلمة المرور بدالة تحقق مخصصة بدل مقارنة الهاشات مباشرةً.

اختيار الكلفة

اختر أعلى كلفة يتحمّلها خادمك مع بقاء تسجيل الدخول سريعًا، وعادةً ما يكون ذلك نحو ربع ثانية لكل عملية تجزئة. توصي OWASP بكلفة لا تقل عن 10 لـ bcrypt. تشغّل المتصفحات bcrypt بلغة JavaScript، وهي أبطأ بعدة مرات من تطبيق أصلي على الخادم: فابتداءً من الكلفة 12 تنبّهك الأداة إلى أن التجزئة قد تستغرق من ثانية إلى عدة ثوانٍ، وكل خطوة إضافية تضاعف الوقت. يُقسَّم العمل إلى شرائح قصيرة، فلا تتجمّد الصفحة.

أما للأنظمة الجديدة، فتفضّل OWASP حاليًا Argon2id، مع بقاء bcrypt مقبولًا حيث لا يتوفر Argon2id.

حدّ الـ 72 بايت

لا يستخدم bcrypt إلا أول 72 بايت من كلمة المرور، ويتجاهل ما بعدها بصمت. والبايتات ليست أحرفًا: فالحرف العربي أو الحرف اللاتيني المشكول يأخذ بايتين في UTF-8، والرمز التعبيري يأخذ 4 بايتات. لذا فكلمة مرور عربية من 36 حرفًا تبلغ الحد بالفعل. وكلمتا مرور طويلتان تشتركان في أول 72 بايت تنتجان الهاش نفسه. ينبّهك عدّاد البايتات عندما تكون كلمة المرور طويلة جدًا. تجزّئ بعض الأنظمة كلمات المرور الطويلة مسبقًا (مثلًا بـ HMAC-SHA256 ثم Base64) قبل bcrypt؛ وإن فعلت ذلك فلا تمرّر أبدًا ناتجًا ثنائيًا خامًا، لأن البايت الصفري ينهي كلمة المرور قبل أوانها في كثير من التطبيقات.

الأسئلة الشائعة

لماذا تعطي كلمة المرور نفسها هاشًا مختلفًا في كل مرة؟

يحصل كل هاش على ملح عشوائي جديد يُحفظ داخله. يقرأ زر تحقّق من كلمة المرور الملح والكلفة من الهاش ويعيد الحساب، لذا تتحقق كل النسخ بنجاح.

هل يمكن فك تشفير هاش bcrypt؟

لا. bcrypt دالة أحادية الاتجاه. الطريقة الوحيدة لاستعادة كلمة مرور هي تخمينها وتجزئة كل تخمين، وهذا بالضبط ما يجعله معامل الكلفة بطيئًا.

ما معامل الكلفة الذي ينبغي أن أستخدمه؟

10 على الأقل، وأكثر إن بقي خادمك سريعًا بما يكفي. قِس الأداء على عتاد بيئة الإنتاج: فالتوقيت المعروض هنا يعكس JavaScript في متصفحك، وهو عادةً أبطأ من الخادم.

هل هاشات $2a$ و$2b$ و$2y$ قابلة للتبادل؟

لكلمات المرور الأقصر من 256 بايت تعطي النتيجة نفسها، وتتحقق هذه الأداة من الثلاثة. جاء $2b$ لإصلاح خلل في التفاف الطول في تطبيق OpenBSD، و$2y$ هو اسم PHP لتطبيق صحيح.

هل من الآمن كتابة كلمة مرور حقيقية هنا؟

كل شيء يجري محليًا، ولا يُرسل أو يُخزَّن أي شيء. ومع ذلك، من الممارسات الجيدة الاختبار بكلمة مرور تجريبية بدل كلمة تستخدمها فعلًا في حساباتك.