كل المقالات

Bcrypt: لماذا تُجزَّأ كلمات المرور ببطء لا بسرعة

حدّ الـ72 بايت في bcrypt يؤثر بشكل مختلف حسب اللغة. الحرف العربي الواحد يشغل عادة بايتين في ترميز UTF-8، أي أن الحد العملي لكلمة مرور عربية هو نحو 36 حرفًا، وليس 72 كما هو الحال مع اللاتينية. والأمر يزداد تعقيدًا مع علامات التشكيل (الفتحة، الضمة، الكسرة، الشدة) إن استُخدمت: كل علامة تشكيل هي نقطة كود UTF-8 منفصلة تُضاف بايتاتها إلى الإجمالي، ما يجعل عبارة مرور عربية طويلة ومُشكَّلة تصل إلى الحد الأقصى أسرع مما قد يتوقعه أي مطوّر.

لماذا تضر السرعة بأمان كلمات المرور

إذا سرق مهاجم قاعدة بيانات تجزئات كلمات مرور، فإنه يحاول استعادة كلمة المرور الأصلية بالقوة الغاشمة. مع دالة سريعة مثل SHA-256، يمكن للأجهزة الحديثة فحص مليارات الاحتمالات في الثانية. أما bcrypt فيجعل تجزئة كلمة مرور واحدة تستغرق عمدًا نحو 100 ميلي ثانية، فتصبح القوة الغاشمة أبطأ وأغلى بمراتب.

ما هو cost factor

لدى bcrypt معامل "cost" يحدد عدد الجولات الداخلية كقوة للعدد 2 (2^cost، عادة بين 10 و12). زيادته بمقدار واحد تضاعف تقريبًا زمن كل عملية تجزئة — وتضاعف بالمثل التكلفة الإجمالية لأي هجوم بالقوة الغاشمة.

ملح مدمج

تولّد bcrypt تلقائيًا ملحًا عشوائيًا فريدًا لكل كلمة مرور وتدمجه مباشرة في الناتج — لا حاجة لتخزين شيء منفصل. كلمتا مرور متطابقتان تُنتجان تجزئتين مختلفتين، وجداول التجزئة المحسوبة مسبقًا (rainbow tables) لكلمات المرور الشائعة تصبح عديمة الفائدة — يجب مهاجمة كل تجزئة على حدة.

لماذا نحتاج هذا

  • تخزين كلمات مرور المستخدمين بشكل صحيح في قاعدة بيانات التطبيق.
  • فهم لماذا يُعدّ SHA-256 أو MD5 خيارًا سيئًا لتجزئة كلمات المرور.
  • اختبار أو ترحيل نظام مصادقة يستخدم bcrypt.

36 حرفًا لا 72

حد البايتات ثابت للجميع — 72 بايت — لكن عدد الأحرف التي تتسع ضمنه يعتمد على الأبجدية. في اللاتينية هذا يعني 72 حرفًا، وفي العربية نحو نصف ذلك بسبب الترميز ثنائي البايت لكل حرف في UTF-8. عند تصميم نموذج تسجيل لجمهور عربي، يستحق هذا الفرق أن يُؤخذ بالحسبان عند تحديد الحد الأقصى لطول كلمة المرور.

جرّب الأداة