كيف تحافظ Devise على أمان كلمات مرور تطبيق ريلز

يعد Devise حلاً مذهلاً للمصادقة لـ Rails مع أكثر من 40 مليون عملية تنزيل. ومع ذلك ، نظرًا لأنها تجرد معظم عمليات التشفير ، فليس من السهل دائمًا فهم ما يحدث وراء الكواليس.

واحدة من تلك الأفكار التجريدية تتوج في استمرار وجود encrypted_passwordمباشرة في قاعدة البيانات. لذلك كنت دائمًا أشعر بالفضول بشأن ما يمثله بالفعل. هذا مثال:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

لكن ماذا تعني هذه الثرثرة؟

يستخدم Devise Bcrypt لتخزين المعلومات بشكل آمن. يذكر على موقعه الإلكتروني أنه يستخدم " خوارزمية OpenBSD bcrypt () لتجزئة كلمة المرور ، مما يتيح لك تخزين تجزئة آمنة لكلمات مرور المستخدمين بسهولة ". ولكن ما هو بالضبط هذا التجزئة؟ كيف يعمل وكيف يحافظ على أمان كلمات المرور المخزنة؟

هذا ما أريد أن أريكم إياه اليوم.

دعونا نعمل بشكل عكسي - من التجزئة المخزنة في قاعدة البيانات الخاصة بك إلى عملية التشفير وفك التشفير.

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOيتكون هذا التجزئة في الواقع من عدة مكونات:

  • إصدار Bcrypt ( 2a) - إصدار خوارزمية bcrypt () المستخدمة لإنتاج هذه التجزئة (المخزنة بعد $العلامة الأولى )
  • التكلفة ( 11) - عامل التكلفة المستخدم لإنشاء التجزئة (المخزنة بعد $العلامة الثانية )
  • Salt ( $2a$11$yMMbLgN9uY6J3LhorfU9iu) - سلسلة عشوائية تجعلها فريدة عند دمجها مع كلمة المرور (أول 29 حرفًا)
  • المجموع الاختباري ( LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) - جزء التجزئة الفعلي من encrypted_passwordالسلسلة المخزنة (السلسلة المتبقية بعد 29 حرفًا)

دعنا نستكشف المعلمات الثلاثة الأخيرة:

  • عند استخدام Devise ، Costيتم تعيين القيمة بواسطة متغير فئة يسمى الامتدادات والقيمة الافتراضية هي 11. تحدد عدد مرات تجزئة كلمة المرور. ( في مُهيئ devise.rb الخاص بك ، يمكنك تكوين هذا إلى قيمة أقل لبيئة الاختبار لجعل مجموعة الاختبار الخاصة بك تعمل بشكل أسرع. ) *
  • و الملح هو سلسلة عشوائية تستخدم لتتحد مع كلمة المرور الأصلية. هذا ما يجعل نفس كلمة المرور لها قيم مختلفة عند تخزينها مشفرة. ( راجع المزيد أدناه حول سبب أهمية ذلك وما هي هجمات Rainbow Table Attack .) **
  • و الاختباري هو التجزئة ولدت الفعلية للكلمة بعد أن جنبا إلى جنب مع الملح عشوائي.

عندما يسجل المستخدم في تطبيقك ، يجب عليه تعيين كلمة مرور. قبل أن يتم تخزين كلمة المرور هذه في قاعدة البيانات ، يتم إنشاء ملح عشوائي عبر BCrypt :: Engine.generate_salt (التكلفة) مع مراعاة عامل التكلفة المذكور سابقًا. (ملاحظة: إذا pepperتم تعيين قيمة متغير الفئة ، فسيتم إلحاق قيمتها بكلمة المرور قبل التمليح.)

باستخدام هذا الملح (على سبيل المثال $2a$11$yMMbLgN9uY6J3LhorfU9iu، والذي يتضمن عامل التكلفة) ، سوف يستدعي BCrypt :: Engine.hash_secret (كلمة المرور ، ملح) الذي يحسب التجزئة النهائية المراد تخزينها باستخدام الملح المُنشأ وكلمة المرور التي يختارها المستخدم. $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOسيتم تخزين هذه التجزئة النهائية (على سبيل المثال ، ) بدورها في encrypted_passwordعمود قاعدة البيانات.

ولكن إذا كانت هذه التجزئة غير قابلة للعكس وتم إنشاء الملح عشوائيًا في BCrypt::Password.createالمكالمة BCrypt::Engine.generate_salt(cost)، فكيف يمكن استخدامها لتسجيل دخول المستخدم؟

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

بعد هذا الإعداد الأولي ، إليك ما سيحدث بعد ذلك:

  1. إحضار كلمة مرور الإدخال ( 1234)
  2. جلب ملح كلمة المرور المخزنة ( $2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. قم بإنشاء التجزئة من كلمة المرور والملح باستخدام نفس إصدار bcrypt وعامل التكلفة ( BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. تحقق مما إذا كانت التجزئة المخزنة هي نفسها التي تم حسابها في الخطوة 3 ( $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)

وهذه هي الطريقة التي تخزن بها Devise كلمات المرور بأمان وتحميك من مجموعة من الهجمات حتى إذا تم اختراق قاعدة بياناتك.

تواصل معنا على Twitteralvesjtiago واسمحوا لي أن أعرف إذا وجدت هذه المقالة مثيرة للاهتمام! شكرا لقرائتك.

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

شكرًا لك @ filipepina وivobenedito وjackveiga وjoao_mags وpedrosmmoreira على التعليقات والاقتراحات. هذه المقالة متاحة أيضًا على //blog.tiagoalves.me/how-does-devise-keep-your-passwords-safe.

مزيد من المعلومات حول بعض المواضيع.

عامل التكلفة *

  • مخاطر عامل تكلفة bcrypt الافتراضي
  • العدد الموصى به من جولات bcrypt

هجمات طاولة قوس قزح **

  • طاولة قوس قزح - ويكيبيديا
  • ما هي طاولات قوس قزح وكيف يتم استخدامها؟