bcrypt

bcrypt هي دالة لتشفير كلمات المرور صممها نيلز بروفوس وديفيد مازيير. وهي مبنية على خوارزمية التشفير Blowfish ، وقد عُرضت في مؤتمر USENIX عام 1999. [ 1 ] بالإضافة إلى تضمينها قيمة ملح (Salt) للحماية من هجمات جداول قوس قزح ، فإن bcrypt دالة تكيفية: فمع مرور الوقت، يمكن زيادة عدد التكرارات لجعلها أبطأ، وبالتالي تظل مقاومة لهجمات البحث الشامل حتى مع زيادة القدرة الحاسوبية.

تُعد دالة bcrypt خوارزمية تجزئة كلمات المرور الافتراضية لنظام OpenBSD ، [ 2 ] وكانت هي الخوارزمية الافتراضية لبعض توزيعات Linux مثل SUSE Linux . [ 3 ]

توجد تطبيقات لـ bcrypt في C و C++ و C# و Embarcadero Delphi و Elixir و [ 4 ] Go و [ 5 ] Java و [ 6 ] [ 7 ] JavaScript و [ 8 ] Perl و PHP و Ruby و Python و Rust و [ 9 ] V (Vlang) و [ 10 ] Zig [ 11 ] ولغات أخرى.

خلفية

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

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

وصف

مدخلات دالة bcrypt هي سلسلة كلمة المرور (حتى 72 بايت)، وتكلفة رقمية، وقيمة ملح (salt) بطول 16 بايت (128 بت). عادةً ما تكون قيمة الملح عشوائية. تستخدم دالة bcrypt هذه المدخلات لحساب تجزئة (hash) بطول 24 بايت (192 بت). يكون الناتج النهائي لدالة bcrypt سلسلة نصية بالشكل التالي:

$2 < a/b/x/y > $[cost]$[22 character salt][31 character hash]

على سبيل المثال، مع إدخال كلمة المرور abc123xyz، والتكلفة 12، وقيمة عشوائية (salt)، يكون ناتج bcrypt هو السلسلة النصية التالية:

$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW \__/\/ \____________________/\_____________________________/ ملح هاش ألج كوست

أين:

  • $2a$: مُعرِّف خوارزمية التجزئة (bcrypt)
  • 12تكلفة المدخلات (2 12 أي 4096 جولة)
  • R9h/cIPz0gi.URNNX3kh2O: ترميز base-64 لملح الإدخال
  • PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW: ترميز Base64 لأول 23 بايت من التجزئة المحسوبة المكونة من 24 بايت

يستخدم ترميز base-64 في bcrypt الجدول ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789، [ 12 ] والذي يختلف عن ترميز RFC 4648 Base64 . 

تاريخ الإصدارات

2 دولار (1999)

حددت مواصفات bcrypt الأصلية بادئة من $2$. وهذا يتبع تنسيق Modular Crypt Format [ 13 ] المستخدم عند تخزين كلمات المرور في ملف كلمات مرور OpenBSD:

  • $1$التشفير القائم على MD5 ('md5crypt')
  • $2$: التشفير القائم على خوارزمية Blowfish ('bcrypt')
  • $sha1$التشفير القائم على SHA-1 ('sha1crypt')
  • $5$التشفير القائم على SHA-256 ('sha256crypt')
  • $6$التشفير القائم على SHA-512 ('sha512crypt')

2a$

لم تحدد المواصفات الأصلية كيفية التعامل مع الأحرف غير ASCII، ولا كيفية التعامل مع حرف الإنهاء الفارغ. تم تنقيح المواصفات لتحديد أنه عند تجزئة السلاسل النصية:

  • يجب أن تكون السلسلة مشفرة بنظام UTF-8
  • يجب تضمين مُنهي السلسلة الفارغ

مع هذا التغيير، تم تغيير الإصدار إلى $2a$. [ 14 ]

2x$، 2y$ (يونيو 2011)

في يونيو 2011، تم اكتشاف خلل في مكتبة crypt_blowfish ، وهي تطبيق PHP لخوارزمية bcrypt. كان الخلل يُعالج الأحرف التي تحتوي على البت الثامن مُفعّلاً بشكل خاطئ. [ 15 ] اقترحوا على مسؤولي النظام تحديث قاعدة بيانات كلمات المرور الحالية، واستبدالها $2a$بـ $2x$، للإشارة إلى أن هذه التجزئات غير صالحة (وتحتاج إلى استخدام الخوارزمية القديمة المعيبة). كما اقترحوا أيضًا أن تُصدر مكتبة crypt_blowfish$2y$ قيمة للتجزئات المُولّدة بواسطة الخوارزمية المُصلحة.

لم يتبنَّ أيٌّ من الجهات الأخرى، بما في ذلك Canonical وOpenBSD، فكرة 2x/2y. واقتصر تغيير علامة الإصدار هذا على crypt_blowfish .

2 مليار دولار (فبراير 2014)

تم اكتشاف خلل في تطبيق خوارزمية bcrypt في نظام OpenBSD. كان التطبيق يستخدم قيمة عددية غير مُوقّعة من 8 بتات لتخزين طول كلمة المرور. [ 14 ] [ 16 ] [ 17 ] بالنسبة لكلمات المرور التي يزيد طولها عن 255 بايت، بدلاً من اقتطاعها عند 72 بايت، كان يتم اقتطاعها عند أصغر قيمة بين 72 أو الطول بعد باقي قسمته على 256. على سبيل المثال، كلمة مرور طولها 260 بايت كانت تُقتطع عند 4 بايتات بدلاً من 72 بايت. عندما قام نظام OpenBSD بإصلاح هذه المشكلة، تم تغيير الإصدار إلى $2b$...

الخوارزمية

تقوم دالة bcrypt الموضحة أدناه بتشفير النص "OrpheanBeholderScryDoubt" 64 مرة باستخدام خوارزمية Blowfish . في bcrypt، يتم استبدال دالة إعداد مفتاح Blowfish المعتادة بدالة إعداد مفتاح مكلفة (EksBlowfishSetup).

دالة bcrypt  المدخلات: التكلفة: عدد (من 4 إلى 31)  log 2 (عدد التكرارات). مثال: 12 ==> 2^ 12 = 4096 تكرارًا. الملح: مصفوفة من البايتات (16 بايت)  ملح عشوائي. كلمة المرور: مصفوفة من البايتات (من 1 إلى 72 بايت)  كلمة مرور مشفرة بنظام UTF-8. المخرجات: التجزئة: مصفوفة من البايتات (24 بايت) // تهيئة حالة Blowfish باستخدام خوارزمية إعداد مفاتيح مكلفة // P: مصفوفة من 18 مفتاحًا فرعيًا (UInt32[18]) // S: أربعة صناديق استبدال (S-boxes)، من S0 إلى S3 . حجم كل صندوق استبدال 1024 بايت (UInt32[256]) P , S ← EksBlowfishSetup( password , salt , cost ) // تشفير النص "OrpheanBeholderScryDoubt" بشكل متكرر 64 مرة ctext"OrpheanBeholderScryDoubt" // 24 بايت ==> ثلاث كتل 64 بت repeat (64) ctext ← EncryptECB( P , S , ctext ) // التشفير باستخدام Blowfish القياسي في وضع ECB// نص ctext بطول 24 بايت هو تجزئة كلمة المرور الناتجة. إرجاع Concatenate( cost , salt , ctext )

إعداد مفتاح مكلف

تعتمد خوارزمية bcrypt بشكل كبير على خوارزمية إعداد المفاتيح "Eksblowfish"، والتي تعمل على النحو التالي:

دالة EksBlowfishSetup  : المدخلات: كلمة المرور: مصفوفة من البايتات (1..72 بايت)  مُشفّرة بـ UTF-8، الملح: مصفوفة من البايتات (16 بايت)  ملح عشوائي ، التكلفة: عدد (4..31)،  لوغاريتم 2 (عدد التكرارات). مثال: 12 ==> 2^ 12 = 4096 تكرارًا . المخرجات: P: مصفوفة من UInt32،  تحتوي كل منها على 18 مفتاحًا فرعيًا لكل جولة. S1..S4 :مصفوفة من UInt32  ، تحتوي كل منها على أربعة صناديق SBox؛ حجم كل صندوق SBox هو 256 UInt32 ( أي أن حجم كل صندوق SBox هو 1 كيلوبايت).// تهيئة P (المفاتيح الفرعية) و S (مربعات الاستبدال) بالأرقام السداسية العشرية لـ π. P ، S ← InitialState() // تبديل P و S بناءً على كلمة المرور والملح P , S ← ExpandKey( P , S , password , salt ) // هذا هو الجزء "المكلف" من "إعداد المفتاح المكلف". // بخلاف ذلك، يكون إعداد المفتاح مطابقًا لإعداد Blowfish. كرر ( تكلفة 2 ) P ، S ← ExpandKey( P ، S ، كلمة المرور، 0) P ، S ← ExpandKey( P ، S ، الملح، 0) إرجاع P و S

تعمل دالة InitialState كما في خوارزمية Blowfish الأصلية، حيث تقوم بملء مصفوفة P وعناصر صندوق S بالجزء الكسري منπ{\displaystyle \pi }بالنظام الست عشري.

مفتاح التوسيع

تقوم وظيفة ExpandKey بما يلي:

دالة ExpandKey  : المدخلات: P: مصفوفة من UInt32  تحتوي على 18 مفتاحًا فرعيًا ، S1 ..S4 : أربعة صناديق SBoxes بحجم 1 كيلوبايت ، كل منها مكون من 1024 بايت. كلمة المرور: مصفوفة من البايتات (من 1 إلى 72 بايت)  مشفرة بنظام UTF-8. الملح: بايتات بحجم 16،  ملح عشوائي . المخرجات: P: مصفوفة من UInt32  تحتوي على 18 مفتاحًا فرعيًا لكل جولة ، S1 ..S4 : أربعة صناديق SBoxes بحجم 1 كيلوبايت ، كل منها مكون من 1024 بايت. // امزج كلمة المرور في مصفوفة المفاتيح الفرعية P من أجل n ← 1 إلى 18، قم بما يلي: P n ← P n xor كلمة المرور [32(n-1)..32n-1] // تعامل مع كلمة المرور على أنها دورية// تعامل مع الملح ذي الـ 128 بت كنصفين من 64 بت (حجم كتلة Blowfish). saltHalf[0] ← salt [0..63] // الجزء السفلي من الملح (64 بت) saltHalf[1] ← salt [64..127] // الجزء العلوي من الملح (64 بت)//تهيئة مخزن مؤقت بحجم 8 بايت (64 بت) بجميع الأصفار. الكتلة ← 0 // امزج الحالة الداخلية في صناديق P من أجل n ← 1 إلى 9 do // عملية XOR لكتلة 64 بت مع نصف كتلة ملح 64 بتكتلة xor saltHalf [(n-1) mod 2] // في كل تكرار يتم التناوب بين saltHalf [0] و saltHalf [1]// تشفير الكتلة باستخدام المفتاح الحالي جدولة الكتلة ← تشفير( P , S , الكتلة ) P 2nblock [0..31] // الجزء السفلي من الكتلة P 2n+1block [32..63] // الجزء العلوي من الكتلة// امزج الحالة المشفرة في صناديق الاستبدال الداخلية للحالة من أجل i ← 1 إلى 4 كرر من أجل n ← 0 إلى 127 كرر block ← Encrypt( state , block xor saltHalf [(n-1) mod 2]) // كما هو مذكور أعلاه S i [2n] ← block [0..31] // 32 بت سفلي S i [2n+1] ← block [32..63] // 32 بت علوي إرجاع الحالة

وبالتالي، فإنّ جدولة مفاتيح Blowfish العادية مماثلة، لأنّ جميع عمليات XOR مع قيمة الملح الصفرية غير فعّالة. وهي مشابهة، ولكنها تستخدم الملح كمفتاح 128 بت.ExpandKey(state, key, 0)ExpandKey(state, salt, 0)

إدخال المستخدم

تقوم العديد من تطبيقات bcrypt بتقليص كلمة المرور إلى أول 72 بايت، وذلك باتباع تطبيق OpenBSD.

تتطلب الخوارزمية الرياضية نفسها تهيئةً باستخدام 18 مفتاحًا فرعيًا من 32 بت (ما يعادل 72 بايتًا). لا تُلزم المواصفات الأصلية لـ bcrypt بطريقةٍ مُحددة لتحويل كلمات المرور النصية من مساحة المستخدم إلى قيم رقمية للخوارزمية. يُشير تعليقٌ موجزٌ في النص، دون إلزام، إلى إمكانية استخدام القيمة المُشفّرة بنظام ASCII لسلسلة أحرف: "أخيرًا، وسيط المفتاح هو مفتاح تشفير سري، والذي يمكن أن يكون كلمة مرور يختارها المستخدم بحد أقصى 56 بايتًا (بما في ذلك بايت صفري نهائي عندما يكون المفتاح سلسلة ASCII)." [ 1 ]

لاحظ أن الاقتباس أعلاه يشير إلى كلمات مرور "تصل إلى 56 بايتًا" على الرغم من أن الخوارزمية نفسها تستخدم قيمة ابتدائية قدرها 72 بايتًا. مع أن بروفوس ومازيير لم يذكرا سبب هذا التقييد الأقصر، إلا أنهما ربما استوحيا ذلك من العبارة التالية الواردة في المواصفات الأصلية لخوارزمية بلوفيش لبروس شناير : "يضمن الحد الأقصى لحجم المفتاح البالغ 448 بتًا أن كل بت من كل مفتاح فرعي يعتمد على كل بت من المفتاح." [ 18 ]

تفاوتت التطبيقات في نهجها لتحويل كلمات المرور إلى قيم رقمية أولية، بما في ذلك تقليل قوة كلمات المرور التي تحتوي على أحرف غير ASCII في بعض الأحيان. [ 19 ]

مقارنة بخوارزميات تجزئة كلمات المرور الأخرى

خوارزمية Bcrypt ليست دالة اشتقاق مفاتيح (KDF) . على سبيل المثال، لا يمكن استخدام Bcrypt لاشتقاق مفتاح بطول 512 بت من كلمة مرور. في المقابل، تُعد خوارزميات مثل pbkdf2 و scrypt و argon2 دوال اشتقاق مفاتيح تعتمد على كلمات المرور، حيث يُستخدم الناتج لاحقًا في تجزئة كلمات المرور وليس فقط في اشتقاق المفاتيح.

عادةً ما تستغرق عملية تجزئة كلمات المرور أقل من 1000 مللي ثانية. في هذه الحالة، يكون bcrypt أقوى من pbkdf2 و scrypt و argon2.

  • PBKDF2 : خوارزمية PBKDF2 أضعف من خوارزمية bcrypt. خوارزمية التجزئة SHA2 الشائعة الاستخدام لا تتطلب ذاكرة كبيرة. صُممت SHA2 لتكون خفيفة الوزن للغاية، ما يسمح بتشغيلها على أجهزة خفيفة الوزن (مثل البطاقات الذكية). [ 20 ] هذا يعني أن PBKDF2 ضعيفة جدًا لتخزين كلمات المرور، نظرًا لسهولة الحصول على أجهزة تجزئة SHA-2 التجارية القادرة على إجراء تريليونات التجزئات في الثانية.
  • scrypt : يعتبر scrypt أضعف من bcrypt بالنسبة لمتطلبات الذاكرة الأقل من 4 ميجابايت. [ 21 ] يتطلب scrypt ما يقرب من 1000 ضعف الذاكرة التي يتطلبها bcrypt لتحقيق مستوى مماثل من الحماية ضد الهجمات القائمة على وحدة معالجة الرسومات (لتخزين كلمات المرور).
  • Argon2 : يُعدّ bcrypt أخفّ وزنًا من Argon2. قد يُشكّل هذا مشكلةً لبعض تطبيقات الويب التي يتطلّب فيها استخدام Argon2 خفض معايير الأمان إلى مستوى غير مقبول للحفاظ على الأداء. تحديدًا، يُعدّ Argon2 أقلّ أمانًا من bcrypt في أوقات التشغيل التي تقلّ عن ثانية واحدة (أي، في مصادقة كلمات المرور الشائعة). لا يُضاهي Argon2 قوة bcrypt أو يتفوّق عليها إلا عند تجاوز أوقات التشغيل 1000 مللي ثانية تقريبًا. قد يكون هذا غير مناسب لتجزئة كلمات المرور، ولكنه مقبول تمامًا لاشتقاق المفاتيح. [ 22 ] في بعض الحالات، يُنصح باستخدام Argon2 بدلًا من bcrypt، إذا كانت معايير الأمان عالية بما يكفي. [ 23 ]
  • يُعدّ خوارزمية pufferfish2 تطورًا لخوارزمية bcrypt، حيث تستخدم حجم ذاكرة قابلًا للتعديل (مثل scrypt وargon2)، بدلًا من حجم الذاكرة الثابت البالغ 4 كيلوبايت في bcrypt. وكما هو الحال في scrypt وargon2، تعتمد pufferfish2 على استخدام ذاكرة أكبر لزيادة صعوبتها. ولكن على عكس scrypt وargon2، تعمل pufferfish2 فقط في ذاكرة التخزين المؤقت L2 الخاصة بنواة المعالج. وبينما تعتمد scrypt وargon2 على الوصول العشوائي إلى كميات كبيرة من ذاكرة الوصول العشوائي (RAM)، فإن pufferfish2 تقتصر على ذاكرة التخزين المؤقت L2 المخصصة لنواة المعالج. وهذا ما يجعل تنفيذها في الأجهزة المخصصة أكثر صعوبة من scrypt وargon2. ويُعتبر حجم الذاكرة الأمثل لـ pufferfish2 مساويًا لحجم ذاكرة التخزين المؤقت المتاحة للنواة (على سبيل المثال، 1.25 ميجابايت لمعالجات Intel Alder Lake [ 24 ] ). وهذا ما يجعل pufferfish2 أكثر مقاومة لوحدات معالجة الرسومات (GPU) أو الدوائر المتكاملة الخاصة بالتطبيقات (ASIC).

الانتقادات

الحد الأقصى لطول كلمة المرور

يبلغ الحد الأقصى لطول كلمة المرور في خوارزمية bcrypt 72 بايت. وينتج هذا الحد الأقصى عن العملية الأولى لدالة ExpandKey التي تستخدم عملية XOR على المفاتيح الفرعية الـ 18 (P) المكونة من 4 بايت مع كلمة المرور.

P 1 ..P 18 ← P 1 ..P 18 xor passwordBytes

تُكرر كلمة المرور (المشفرة بنظام UTF-8) حتى يصل طولها إلى 72 بايت. على سبيل المثال، كلمة المرور هي:

correct horse battery staple␀(29 بايت)

يتم تكرارها حتى تتطابق مع 72 بايت من المفاتيح الفرعية الـ 18 لكل جولة:

correct horse battery staple␀correct horse battery staple␀correct horse (72 بايت)

في أسوأ الأحوال، يقتصر طول كلمة المرور على 18 حرفًا، بينما يتطلب كل حرف 4 بايتات من ترميز UTF-8. على سبيل المثال:

𐑜𐑝𐑟𐑥𐑷𐑻𐑽𐑾𐑿𐑿𐑰𐑩𐑛𐑙𐑘𐑙𐑒𐑔(18 حرفًا، 72 بايت)

في عام 2024، أعلنت خدمة تسجيل الدخول الموحد التابعة لشركة Okta عن ثغرة أمنية ناتجة عن دمج كلمة المرور بعد اسم المستخدم وتشفير الزوج باستخدام bcrypt، مما أدى إلى تجاهل كلمة المرور عند تسجيل الدخول باستخدام اسم مستخدم طويل بما فيه الكفاية. [ 25 ]

اقتطاع تجزئة كلمة المرور

تتضمن خوارزمية bcrypt تشفير النص المكون من 24 بايت بشكل متكرر:

OrpheanBeholderScryDoubt(24 بايت)

ينتج عن هذا 24 بايت من النص المشفر، على سبيل المثال:

85 20 af 9f 03 3d b3 8c 08 5f d2 5e 2d aa 5e 84 a2 b9 61 d2 f1 29 c9 a4(24 بايت)

يقوم تطبيق OpenBSD القياسي بتقليص هذا إلى 23 بايت: [ 26 ]

85 20 af 9f 03 3d b3 8c 08 5f d2 5e 2d aa 5e 84 a2 b9 61 d2 f1 29 c9(23 بايت)

من غير الواضح لماذا يقوم التنفيذ القياسي بحذف 8 بتات من تجزئة كلمة المرور الناتجة.

تتحول هذه البايتات الـ 23 إلى 31 حرفًا عند ترميزها بنظام base-64:

fQAtluK7q2uGV7HcJYncfII3WbJvIai(31 حرفًا)

أبجدية ترميز Base64

يستخدم نظام التشفير المستخدم في تطبيق OpenBSD القياسي نفس أبجدية Base64 المستخدمة في crypt ، وهي أبجدية Base64 غير نمطية . [ 12 ] ولذلك، فإن هذا التشفير غير متوافق مع تشفير Base64 الأكثر شيوعًا RFC 4648 .

انظر أيضاً

مراجع

  1. 1 2 بروفوس ن ، مازيير د (10 يونيو 1999). مخطط كلمات مرور قابل للتكيف مع المستقبل (ملف PDF) . المؤتمر التقني السنوي لـ USENIX لعام 1999. المجلد. وقائع مسار FREENIX. مونتيري، كاليفورنيا: جمعية USENIX . 
  2. "سجل CVS للملف src/lib/libc/crypt/bcrypt.c" . مستودع CVS . OpenBSD . 23 مارس 2014. المراجعة 1.32 (أول ذكر لـ bcrypt في السجل) . تم الاسترجاع في 25 مايو 2023. تغيير طفيف في تطبيق bcrypt بحيث لا يتطلب متغيرات عامة ثابتة .
  3. "إعلان أمني من SUSE: (SUSE-SA:2011:035)" . إشعارات أمنية . SUSE . 23 أغسطس 2011. مؤرشف من الأصل في 4 مارس 2016. تم الاطلاع عليه في 20 أغسطس 2015. يدعم تطبيق crypt() الخاص بـ SUSE دالة تجزئة كلمات المرور Blowfish (المعرف $2a) ، وتستخدم عمليات تسجيل الدخول إلى النظام هذه الطريقة افتراضيًا.
  4. ويتلوك، ديفيد (21 سبتمبر 2021). "Bcrypt Elixir: خوارزمية تجزئة كلمات المرور bcrypt للغة Elixir" . GitHub . riverrun.
  5. "حزمة bcrypt" . godoc.org .
  6. "jBCrypt - تشفير قوي لكلمات المرور في جافا" . www.mindrot.org . تم الاطلاع عليه بتاريخ 11 مارس 2017 .
  7. "bcrypt - تطبيق مستقل بلغة جافا لدالة تجزئة كلمة المرور bcrypt" . github.com . تم الاطلاع عليه بتاريخ 19-07-2018 .
  8. "bcryptjs" . npm . riverrun. 7 فبراير 2017.
  9. "rust-bcrypt" . GitHub . فنسنت برويليه. 8 نوفمبر 2024.
  10. "V Bcrypt" . vlang .
  11. "zigstd" . GitHub . jedisct1. 26 أكتوبر 2020.
  12. 1 2 بروفوس، نيلز (13 فبراير 1997). "شفرة المصدر bcrypt.c، السطران 57-58" . تم الاطلاع عليه بتاريخ 29 يناير 2022 .
  13. "تنسيق التشفير المعياري - وثائق Passlib الإصدار 1.7.1" . passlib.readthedocs.io .
  14. 1 2 "إصلاح أخطاء تجزئة كلمة مرور bcrypt، تغييرات الإصدار وعواقبها" . undeadly.org .
  15. مصمم، سولار. "oss-sec: طلب CVE: crypt_blowfish سوء معالجة الأحرف ذات 8 بت" . seclists.org .
  16. "تغييرات إصدار bcrypt - MARC" . marc.info .
  17. "إصلاح كود bcrypt.c لخطأ عام 2014" . 17 فبراير 2014. مؤرشف من الأصل في 18 فبراير 2022. تم الاطلاع عليه في 17 فبراير 2022 .
  18. شناير، بروس (ديسمبر 1993). "التشفير البرمجي السريع، وصف لمفتاح جديد متغير الطول، تشفير كتلة 64 بت (بلوفيش)" . وقائع ورشة عمل كامبريدج للأمن . سبرينغر-فيرلاغ: 191-204 .
  19. "تنبيه أمني بشأن jBCrypt" . 1 فبراير 2010.و "التغييرات في CRYPT_BLOWFISH في PHP 5.3.7" . php.net .
  20. معيار التشفير الآمن nist.gov
  21. "لماذا لا أنصح باستخدام سكريبت" . 12 مارس 2014.
  22. "Argon2 مقابل bcrypt مقابل scrypt: أي خوارزمية تجزئة مناسبة لك؟" . مارس 2023.
  23. "ورقة غش لتخزين كلمات مرور OWASP" .
  24. "مواصفات المنتج" .
  25. جونز، كونر (4 نوفمبر 2024). "لماذا الاسم الطويل؟ أوكتا تكشف عن ثغرة في تجاوز المصادقة تؤثر على أسماء المستخدمين المكونة من 52 حرفًا" . ذا ريجستر . تم الاطلاع عليه في 5 نوفمبر 2024 .
  26. "src/lib/libc/crypt/bcrypt.c at master · openbsd/src" . GitHub . 2016-08-30 . تم الاطلاع عليه بتاريخ 2024-12-03 .
  27. الصفحة الرئيسية لبرنامج تشفير الملفات bcrypt
  28. "تطبيق bcrypt APK لنظام Android - تحميل مجاني من Droid Informer" . droidinformer.org .
  29. "حزمة T2 - trunk - bcrypt - أداة لتشفير الملفات" . t2sde.org .
  30. ^ "Oracle GoldenGateのライセンス" . docs.Oracle.com .