مولد bcrypt

ما زال bcrypt أحد أكثر الخيارات أمانا لتخزين كلمات المرور. فهو بطيء عمدا، ويشتق salt الخاص به، ويتدرج أمام تحسن العتاد عبر معامل cost قابل للضبط. يولد هذا المولد hash متوافقا مع معيار bcrypt من كلمة مرور نصية حتى تستطيع إنشاء مستخدم اختبار، أو ترحيل حساب بين أنظمة، أو مقارنة القيم مع hash موجود في عمود users.password.

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

  1. 1

    أدخل كلمة المرور النصية

    حتى 72 بايت — يقتطع bcrypt ما بعد ذلك بصمت.

  2. 2

    اختر عامل cost

    10 هو الافتراضي الحالي؛ 12 شائع للأنظمة الجديدة؛ 14 حذر جدا. كل +1 يضاعف زمن التجزئة تقريبا.

  3. 3

    ينشأ salt عشوائي

    تسحب 16 بايت من salt من RNG تشفيري وتدمج داخل سلسلة hash الناتجة.

  4. 4

    انسخ hash

    الخرج سلسلة تصف نفسها مثل `$2b$12$...` وتتضمن version وcost وsalt وdigest.

تشريح hash من bcrypt

$2b$12$mE2n5YqWjKqT9tXg.OQPoeeHZJ9hdSvOt5wFdRRQwl6yE1vWWY3z6
  |   |  |                      |
  |   |  salt (22 Base64 chars)  digest (31 Base64 chars)
  |   cost (2 digits, 4-31)
  version (2a, 2b, 2y — all bcrypt)

السلسلة كلها 60 محرفا. الأعمدة من نوع VARCHAR(60) أو CHAR(60) هي المخطط القياسي.

توصيات عامل cost

Cost الزمن التقريبي لكل hash (2024 CPU) الاستخدام
10 ~80 ms افتراضي legacy، ما زال مقبولا
12 ~300 ms خط الأساس الموصى به حاليا
13 ~600 ms تطبيقات أعلى أمانا
14 ~1.2 s حذر جدا؛ تأخير تسجيل دخول ملحوظ

كل زيادة تضاعف عامل العمل. إذا كانت زمنية تسجيل الدخول تحت 500 ms حرجة، فابق بين 10 و12.

بايت الإصدار: 2a مقابل 2b مقابل 2y

  • $2a$ — مواصفة 1999 الأصلية. معظم المكتبات تصدر hashes بعلامة 2a.
  • $2b$ — مراجعة 2014 التي أصلحت خطأ اقتطاع في crypt_blowfish. مفضل للـ hashes الجديدة.
  • $2y$ — وسم خاص بـ PHP، ومكافئ وظيفيا لـ $2b$.

تتحقق الثلاثة ضد بعضها؛ الاختلاف الوحيد هو الوسم داخل سلسلة hash.

مما يحمي bcrypt

  • Rainbow tables — salt فريد لكل hash يهزم الجداول المحسوبة مسبقا.
  • GPU/ASIC cracking — جدول مفاتيح Blowfish مقيد بالذاكرة وعدائي تجاه GPUs. ليس معاديا لـ GPU مثل Argon2، لكنه ما زال بطيئا في brute force.
  • Database leaks — لا يمكن استرجاع النص الصريح من hash إلا بالقوة الغاشمة.

ما لا يحمي منه bcrypt: كلمات المرور الضعيفة (استخدم حدا أدنى للطول وافحص قوائم التسريبات)، وcredential stuffing (استخدم عاملا ثانيا)، والتصيد.

حد 72 بايت

يستخدم bcrypt أول 72 بايت فقط من كلمة المرور. المدخلات الأطول تقتطع بصمت، وهذا هو السبب نفسه الذي يجعل كثيرا من المكتبات توصي الآن بتجزئة كلمة المرور مسبقا بـ SHA-256 قبل تمريرها إلى bcrypt. البدائل الحديثة (Argon2 وscrypt) لا تملك هذا الحد.

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

نعم لتخزين كلمات المرور، عند cost ≥ 12. ما زال OWASP يدرجه كخوارزمية مقبولة. Argon2id هو الخيار المفضل للأنظمة الجديدة، لكن ترحيل hashes bcrypt القديمة ليس أولوية عالية.

لأن salt يولد عشوائيا لكل hash. يأخذ التحقق salt من hash المخزن، ويعيد تجزئة كلمة المرور المرسلة به، ثم يقارن.

معظم المكتبات لا تكشف هذا الخيار، ولسبب وجيه — salts القابلة للتنبؤ تهزم الفكرة. استخدم salt الذي تولده المكتبة؛ هذا هو المسار الآمن.

نعم — عامل العمل متناظر. التحقق من hash بتكلفة 14 يستغرق 16x أكثر من التحقق من hash بتكلفة 10. اضبطه مع وضع قدرة تسجيل الدخول لديك في الحسبان.

أدوات ذات صلة