Command Palette

Search for a command to run...

كيف يعمل Bcrypt: الملح وعامل التكلفة والحدود

كيف يعمل Bcrypt: الملح وعامل التكلفة والحدود

T
Toolz Team
|Sep 13, 2026|17 دقيقة قراءة
تفضل Toolz.dev على Google

جزء من مجموعة الأمان

مولد بكريبت

قم بإنشاء تجزئة كلمة المرور bcrypt والتحقق منها في المتصفح باستخدام عامل تكلفة قابل للتعديل

استخدم مولد بكريبت

في المرة الأولى التي قمت فيها بشحن نظام تسجيل الدخول، فعلت الشيء الذي طلب مني كل برنامج تعليمي من تلك الحقبة أن أفعله: المخزن md5($password) في جدول المستخدمين وانتقل. لقد نجح الأمر، وكانت كارثة بهدوء. بعد سنوات من إنشاء المصادقة في مكونات WordPress الإضافية وتطبيقات Laravel لاحقًا، أصبح لدي احترام أكثر صحة للفجوة بين &quot؛ يتم تمرير التحقق من كلمة المرور وحصيلة المرور؛ و&حصة؛ كلمات المرور آمنة إذا تسربت قاعدة البيانات هذه.&حصصة؛ Bcrypt هي الأداة التي تغلق معظم هذه الفجوة، وهي الأداة الافتراضية في كل إطار عمل أصل إليه تقريبًا. لذلك قمت ببناء مولد بكريبت على تولز.ديف يقوم بتجزئة كلمة المرور بعامل التكلفة الذي تتحكم فيه، والتحقق من كلمة المرور مقابل تجزئة موجودة، ويقوم بكل ذلك في متصفحك بحيث لا يتم إرسال أي شيء تكتبه إلى أي مكان. هذا هو الدليل لها ولتشفير نفسها.

ليرة تركية؛DR: يقوم Bcrypt بتحويل كلمة المرور إلى تجزئة مملحة وبطيئة بشكل متعمد مكونة من 60 حرفًا، لذا فإن قاعدة البيانات المسربة ليست قائمة كلمات مرور مسربة. الأدوات مولد بكريبت يقوم بتجزئة أي كلمة مرور بعامل تكلفة قابل للتعديل (من 4 إلى 31)، والتحقق من كلمة المرور مقابل التجزئة التي تقوم بلصقها، وإظهار الإصدار والتكلفة والملح الذي تم تحليله. وتنتج المعيار $2b$ تنسيق OpenBSD، PHP password_hashتقبل مكتبات Laravel وNode bcrypt جميعها، وتعمل بالكامل من جانب العميل.

ما هو bcrypt؟

Bcrypt هي وظيفة تجزئة كلمات المرور صممها نيلز بروفوس وديفيد مازيريس وتم تقديمها في ورقة USENIX لعام 1999 &quot؛ نظام وحاصل كلمات المرور القابل للتكيف في المستقبل؛. إنه مبني على تشفير كتلة Blowfish، ولكن مع تطور: بدلاً من تشفير البيانات، يقوم بتشغيل خطوة إعداد المفتاح Blowfish&#39؛ مرارًا وتكرارًا، باستخدام كلمة المرور والملح العشوائي كمادة رئيسية. والنتيجة هي تجزئة أحادية الاتجاه رخيصة الحساب مرة واحدة ومكلفة الحساب مليار مرة، وهو بالضبط ما تحتاجه وحدة تخزين كلمة المرور الخاصة بالخاصية.

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

لقد نجت BCrypt لأكثر من عقدين من الزمن لأنها حصلت على الأساسيات الصحيحة ولأنها قابلة للتكيف. عامل التكلفة يعني أن نفس الخوارزمية التي تم ضبطها لأجهزة 1999 يمكن الاتصال بها لأجهزة 2026 دون تغيير أي شيء آخر. ويظل خيارًا موصى به في ورقة الغش لتخزين كلمة المرور OWASP، وهو الإعداد الافتراضي الجاهز في Laravel وSpring Security والعديد من الأكوام الأخرى التي أعمل فيها. إذا كنت تريد خلفية أعمق حول سبب خطأ التجزئة السريعة في هذه المهمة، فإن أدوات خصوصية البيانات عبر الإنترنت يغطي الدليل الأسباب التي دفعت الصناعة بأكملها نحو التجزئة البطيئة والمملحة.

ماذا تحتوي تجزئة bcrypt؟

أحد أجمل الأشياء في bcrypt هو أن مخرجاتها تصف نفسها بنفسها. خذ تجزئة حقيقية:

$2b$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW

اقرأ من اليسار إلى اليمين، وانقسم على علامات الدولار، وسيخبرك بكل ما يلزم للتحقق من كلمة المرور مقابلها

مجال مثال معنى
إصدار 2b البديل bcrypt. 2b هو تنسيق OpenBSD المصحح الحالي
تكلفة 12 عامل العمل. يعمل إعداد المفتاح 2^12 = 4096 تكرارًا
ملح R9h/cIPz0gi.URNNX3kh2O 22 حرفًا من Base64 المخصص، وفك التشفير إلى 16 بايت عشوائي
ملخص PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW 31 حرفًا تقوم بتشفير إخراج bcrypt ذو 23 بايت

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

تستحق الأبجدية Base64 المخصصة ملاحظة، لأنها تنقل الأشخاص إلى أعلى. يستخدم Bcrypt ./A-Za-z0-9، وهو ترتيب مختلف عن Base64 القياسي. ملح bcrypt ليس سلسلة Base64 قياسية، لذا لا تحاول فك تشفيرها باستخدام أداة Base64 عامة وتوقع بايتات ذات معنى. إذا كنت مهتمًا بالمتغير القياسي المستخدم في كل مكان آخر، فإن ترميز base64 يمشي المرشد عبر الأبجدية العادية وأين تظهر.

كيف أقوم بإنشاء تجزئة bcrypt؟

تتكون الأداة من ثلاث خطوات: اكتب كلمة المرور، واختر التكلفة، وانقر فوق إنشاء. تحت الغطاء، يؤدي إنشاء تجزئة إلى أكثر مما تبدو. أولاً، يتم إنشاء ملح عشوائي قوي مشفرًا يبلغ 16 بايت باستخدام Web Crypto API. ثم يقوم bcrypt بتشغيل جدول المفاتيح الباهظ الثمن، حيث يقوم بزرع Blowfish بكلمة المرور والملح وتكرار 2^ مرات التكلفة. وأخيرًا، يقوم بتشفير سلسلة سحرية ثابتة (&quot؛OrpheanBeholderScryDoubt&quot؛) 64 مرة مع حالة التشفير الناتجة ويقوم Base64 بتشفير الإخراج. تنتج هذه الرقصة بأكملها تجزئة مكونة من 60 حرفًا.

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

في رمز التطبيق الخاص بك، لا تقوم أبدًا بتجميع أي من هذا يدويًا. تتصل بالمكتبة:

// PHP
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// Node with bcrypt / bcryptjs
const hash = await bcrypt.hash(password, 12)
// Laravel
use Illuminate\Support\Facades\Hash;
$hash = Hash::make($password); // bcrypt by default

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

كيف أختار عامل التكلفة؟

عامل التكلفة هو المقبض الوحيد الذي يجب أن تفكر فيه، والإجابة الصادقة هي &quot؛ قياس، لا تنسخ.&quot؛ القاعدة الأساسية من OWASP هي أن التجزئة الواحدة يجب أن تستغرق حوالي ربع ثانية على أجهزة الإنتاج الخاصة بك. يوازن هذا الهدف بين قوتين متعارضتين: منخفض جدًا وتجعل عملية التكسير رخيصة جدًا، ومرتفعة جدًا، وكل تسجيل دخول مشروع يدفع الثمن، وهو أمر مهم عندما تقوم نقطة نهاية مزدحمة بتجزئة كل طلب.

لأن التكلفة هي قوة اثنين، كل خطوة تضاعف العمل. التكلفة 11 أبطأ مرتين من التكلفة 10، والتكلفة 12 أبطأ بأربع مرات. في أجهزة الخادم النموذجية في العشرينيات، تتراوح التكلفة من 10 إلى 12 أرضًا في الحي الأيمن، ولهذا السبب تكون الأطر افتراضية هناك. تعرض الأداة تقديرًا تقريبيًا للوقت أثناء سحب شريط التمرير حتى تتمكن من الشعور بمدى سرعة تفاقم التكلفة، ولكن تعامل مع ذلك كدليل نسبي، وليس كمعيار لخادمك. يعتمد الرقم الحقيقي على وحدة المعالجة المركزية الخاصة بك، والطريقة الوحيدة لمعرفة ذلك هي تحديد الوقت password_hash على الصندوق الذي سيتم تشغيله.

نمط عملي واحد يستحق المعرفة: نظرًا لأن التكلفة مخزنة داخل كل تجزئة، يمكنك رفعها بمرور الوقت دون ترحيل. عند تسجيل الدخول الناجح، يكون لديك النص العادي في متناول اليد للحظة، لذا يمكنك التحقق مما إذا كانت تكلفة التجزئة &#39؛ المخزنة أقل من هدفك الحالي، وإذا كان الأمر كذلك، قم بإعادة الصياغة والتحديث. PHP يكشف هذا مباشرة من خلال password_needs_rehash. وهذا يعني أن أمانك يواكب الأجهزة دون فرض إعادة تعيين كلمة المرور على الإطلاق.

Bcrypt مقابل SHA-256 وArgon2 وscrypt

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

وظيفة مملح بطيئة عن قصد الذاكرة صعبة جيد لكلمات المرور؟
MD5/شا-256 لا (في حد ذاته) لا لا لا، بسرعة كبيرة جدا
بكريبت نعم، بنيت في نعم، تكلفة قابلة للضبط لا نعم، أوصى
سكريبت نعم نعم نعم نعم
أرجون2id نعم نعم نعم نعم، يفضل للأنظمة الجديدة

إن SHA-256 العارية لكلمة المرور، حتى المملحة، هي أداة خاطئة: فهي مصممة للسرعة، لذا فإن قاعدة البيانات المسربة لتجزئة SHA-256 المملحة تقع بسرعة على وحدة معالجة الرسومات. إذا كنت تحتاج فقط إلى ملخص سريع للمجموع الاختباري أو مفتاح ذاكرة التخزين المؤقت بدلاً من كلمة المرور، فهذا هو ما مولد التجزئة هو، والتمييز هو بيت القصيد. يضيف Argon2id، الفائز في مسابقة تجزئة كلمات المرور لعام 2015، صلابة الذاكرة، التي تقاوم الأجهزة المخصصة التي يمكنها تسريع bcrypt، وهو الخيار الأول لنظام جديد تمامًا حيث يمكنك التحكم في وقت التشغيل. لكن bcrypt ليس قديمًا. لقد تم اختباره في المعركة، وهو الإعداد الافتراضي في الأدوات التي أستخدمها يوميًا، واختياره هو قرار سليم، خاصة عندما يشحنه إطار العمل الخاص بك. الخطأ الذي يجب تجنبه ليس &quot؛bcrypt بدلاً من Argon2،&quot؛ إنه &quot؛ تجزئة سريعة بدلاً من أي منها.&quot؛ للقيام بجولة أوسع في أدوات الأمان المساعدة في التجزئة، أدوات إنتاجية المطور الدليل لديه الخريطة.

ماذا عن حد 72 بايت وغيرها من gotchas؟

يقرأ Bcrypt فقط أول 72 بايت من كلمة المرور. أي شيء مضى يتم تجاهله بصمت، والذي لا يهم أبدًا بالنسبة لكلمات المرور العادية ولكن يمكن أن يحتوي على عبارة مرور طويلة جدًا، خاصة تلك التي تحتوي على أحرف UTF-8 متعددة البايت حيث يرتفع عدد البايتات بشكل أسرع من عدد الأحرف. تحذرك الأداة عندما يتجاوز إدخالك 72 بايت UTF-8، لذا فإن الاقتطاع لا يمثل مفاجأة صامتة أبدًا. تعمل بعض الأنظمة على تجاوز الحد عن طريق التجزئة المسبقة لكلمة المرور باستخدام تشفير SHA-256 وBase64 قبل تسليمها إلى bcrypt، مما يؤدي إلى طي كلمة مرور طويلة بشكل تعسفي في إدخال قصير ثابت؛ إذا قمت بذلك، فافعل ذلك باستمرار عند كل من التسجيل وتسجيل الدخول.

المسكتك الأخرى هي بادئة الإصدار. سوف ترى $2a$، $2y$، و $2b$ في البرية. $2a$ كان الأصلي، $2y$ هل تم تقديم علامة خاصة بـ PHP بعد العثور على خطأ في امتداد الإشارة في بعض التطبيقات، و $2b$ هو الإصدار الحالي المصحح من OpenBSD. للتجزئة الجديدة التي تريدها $2b$، وهو ما تنتجه هذه الأداة. يتم التحقق من الثلاثة بشكل مماثل بالنسبة لكلمات مرور ASCII العادية؛ تظهر الاختلافات فقط مع بايتات معينة غير ASCII بالقرب من حدود 72 بايت. عند لصق رمز مميز في أداة تقوم أيضًا بفحص بيانات الاعتماد المنظمة، مثل فك JWTضع في اعتبارك أن تجزئة bcrypt ليست رمزًا مميزًا تقوم بفك تشفيره لقراءة الحمولة؛ إنه ملخص أحادي الاتجاه ولا يوجد ما يمكن الكشف عنه.

حيث يتناسب مولد bcrypt مع سير عمل حقيقي

التجزئة في حد ذاتها ليست سوى نصف القصة، لذا فإن الخلاط يجلس جنبًا إلى جنب مع أدوات الاعتماد الأخرى التي أبقيها مفتوحة. عندما أقوم بزرع قاعدة بيانات اختبارية أو إعداد حساب تجريبي، أقوم بإنشاء كلمة المرور نفسها باستخدام مولد كلمة المرور، تأكد من أنه يمسح شريط القوة المعقول باستخدام مدقق قوة كلمة المرور، وعندها فقط قم بتشغيله عبر مولد بكريبت للحصول على التجزئة المخزنة. هذا الترتيب مهم: من الصعب حقًا كسر كلمة مرور عشوائية قوية وراء تجزئة cost-12 bcrypt، في حين أن كلمة المرور الضعيفة وراء نفس التجزئة لا تزال تقع في هجوم القاموس، لأن المهاجم لا يتعين عليه سوى تخمين عدد قليل من المرشحين المحتملين بدلاً من مساحة المفاتيح بأكملها. عامل التكلفة يشتري لك الوقت؛ إنتروبيا كلمة المرور هي ما يقضي هذا الوقت ضده.

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

الأسئلة المتداولة

هل من الآمن تجزئة كلمة مرور حقيقية في مولد bcrypt هذا؟

نعم، لأن التجزئة تحدث بالكامل في متصفحك ولا يتم إرسال أي شيء إلى أي مكان. يمكنك تأكيد ذلك في علامة تبويب الشبكة الخاصة بأدوات المطور الخاصة بك: إنشاء تجزئة لا يؤدي إلى أي طلب. ومع ذلك، فإن علامة تبويب المتصفح ليست مدير كلمات مرور، لذا تجنب لصق بيانات الاعتماد المباشرة لحساب الإنتاج في أي صفحة ويب لم تقم بإنشائها، وأغلق علامة التبويب عند الانتهاء.

لماذا تنتج كلمة المرور نفسها تجزئة bcrypt مختلفة في كل مرة؟

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

ما هو عامل التكلفة الذي يجب أن أستخدمه لـ bcrypt؟

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

هل يمكن عكس تجزئة bcrypt مرة أخرى إلى كلمة المرور؟

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

هل لا يزال bcrypt آمنًا في عام 2026، أم يجب أن أتحول إلى Argon2؟

لا يزال BCrypt يعتبر آمنًا لتخزين كلمات المرور ويظل خيارًا موصى به في ورقة الغش الخاصة بتخزين كلمات المرور OWASP. يُفضل Argon2id، الفائز في مسابقة تجزئة كلمات المرور لعام 2015، للأنظمة الجديدة حيث تتحكم في وقت التشغيل لأنه يقاوم أيضًا هجمات وحدة معالجة الرسومات والأجهزة المتخصصة. يعد Bcrypt خيارًا سليمًا، خاصة عندما يقوم إطار العمل الخاص بك بشحنه كإعداد افتراضي؛ الخطأ الحقيقي هو استخدام تجزئة سريعة للأغراض العامة بدلاً من أي وظيفة لتجزئة كلمات المرور.

ما هو حد 72 بايت في bcrypt؟

يقرأ Bcrypt فقط أول 72 بايت من كلمة المرور المشفرة UTF-8، لذلك يتم تجاهل أي أحرف تتجاوز ذلك. بالنسبة لكلمات المرور العادية، لا يهم هذا أبدًا، ولكن يمكن اقتطاع عبارة مرور طويلة جدًا، ولهذا السبب تقوم بعض الأنظمة بتجزئة كلمة المرور مسبقًا باستخدام SHA-256 قبل bcrypt. تحذرك هذه الأداة عندما يتجاوز إدخالك 72 بايت، لذا فإن الاقتطاع ليس مفاجئًا أبدًا.

ماذا تعني البادئات $2a$ و$2b$ و$2y$؟

إنها علامات إصدار لتنسيق إخراج bcrypt. كان $2a$ هو الإصدار الأصلي، وكان $2y$ إصلاحًا خاصًا بـ PHP لخلل في تمديد الإشارة، و$2b$ هو إصدار OpenBSD المصحح الحالي. بالنسبة للتجزئة الجديدة، $2b$ صحيح، وهو ما تنتجه هذه الأداة. يتم التحقق من الثلاثة بشكل مماثل بالنسبة لكلمات مرور ASCII؛ تظهر الاختلافات فقط مع بايتات معينة غير ASCII عند حدود 72 بايت.

هل bcrypt هو نفس التشفير؟

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

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!