استبدال كلمة مرور النص العادي للتطبيق

StackOverflow https://stackoverflow.com/questions/59022

  •  09-06-2019
  •  | 
  •  

سؤال

نقوم حاليًا بتخزين كلمات مرور نصية عادية لتطبيق ويب لدينا.

ما زلت أؤيد الانتقال إلى تجزئة كلمة المرور ولكن مطورًا آخر قال إن هذا سيكون أقل أمانًا - يمكن أن تتطابق المزيد من كلمات المرور مع التجزئة وسيكون هجوم القاموس/التجزئة أسرع.

هل هناك أي حقيقة لهذه الحجة؟

هل كانت مفيدة؟

المحلول

لا شيء على الاطلاق.ولكن لا يهم.لقد قمت بنشر رد مماثل من قبل:

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

نصائح أخرى

من ويكيبيديا

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

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

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

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

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

لا أفهم كيف يمكن أن تتطابق أشياء المطورين الأخرى مع "المزيد من كلمات المرور" مع التجزئة.

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

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

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

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

لمنع هجمات القاموس/التجزئة، تأكد من التجزئة مقابل رمز مميز فريد لكل مستخدم وثابت (اسم المستخدم/تاريخ الانضمام/دليل المستخدم يعمل بشكل جيد)

إذا لم تقم بملء كلمة المرور الخاصة بك، فأنت مشتبه في تعرضك لهجمات Rainbow Table (قواميس مجمعة مسبقًا تحتوي على مدخلات صالحة لتجزئة معينة)

يجب على المطور الآخر التوقف عن الحديث عن الأمان إذا كنت تقوم بتخزين كلمات المرور بنص عادي والبدء في القراءة عن الأمان.

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

لذا:قم بملح كلمات المرور الخاصة بك (عن طريق إضافة الملح إلى الجانب الأيمن من كلمة المرور*) واستخدم خوارزمية تجزئة جيدة مثل SHA-1 أو يفضل SHA-256 أو SHA-512.

ملاحظة:مزيد من التفاصيل حول التجزئة هنا.

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

هناك قول مأثور عن المبرمجين الذين يتظاهرون بأنهم متخصصون في التشفير :)

لدى جيف أتوود مشاركة جيدة حول هذا الموضوع: من المحتمل أنك تقوم بتخزين كلمات المرور بشكل غير صحيح

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

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

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

أود أن أزعم أن تخزين كلمات المرور في نص عادي يمثل خطرًا أمنيًا أكبر بكثير من تصادمات التجزئة في مطابقة كلمة المرور.

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

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

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

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

String hashedPass=CryptUtils.MD5("alsdl;ksahglhkjfsdkjhkjhkfsdlsdf" + user.getCreateDate().toString() +  user.getPassword);

طالما أن الملح الخاص بك سري، أو أن المهاجم لا يعرف التاريخ الدقيق لإنشاء سجل المستخدم، فسوف يفشل هجوم القاموس - حتى في حالة تمكنه من سحب حقل كلمة المرور.

ليس هناك ما هو أقل أمانًا من تخزين كلمات المرور ذات النص العادي.إذا كنت تستخدم خوارزمية تجزئة مناسبة (على الأقل SHA-256، ولكن حتى SHA-1 أفضل من لا شيء) فنعم، التصادمات ممكنة، ولكن لا يهم لأنه في حالة التجزئة، فمن المستحيل* حساب ما سلاسل التجزئة لذلك.إذا قمت بتجزئة اسم المستخدم مع كلمة المرور، فسيختفي هذا الاحتمال أيضًا.

* - ليس مستحيلاً من الناحية الفنية، ولكنه "غير ممكن من الناحية الحسابية"

إذا كان اسم المستخدم هو "graeme" وكلمة المرور هي "stackoverflow"، فقم بإنشاء سلسلة "graeme-stackoverflow-1234" حيث يكون 1234 رقمًا عشوائيًا، ثم قم بتجزئته وتخزينه "com.hashoutput1234" في قاعدة البيانات.عندما يتعلق الأمر بالتحقق من صحة كلمة المرور، خذ اسم المستخدم وكلمة المرور المقدمة والرقم من نهاية القيمة المخزنة (التجزئة لها طول ثابت حتى تتمكن دائمًا من القيام بذلك) وقم بتجزئة كل منهم معًا، ومقارنتها بالتجزئة جزء من القيمة المخزنة.

يمكن أن تتطابق المزيد من كلمات المرور مع التجزئة وسيكون هجوم القاموس/التجزئة أسرع.

نعم و لا.استخدم خوارزمية التجزئة الحديثة، مثل متغير SHA، وستصبح هذه الحجة ضعيفة للغاية.هل تحتاج حقًا إلى القلق إذا كان هجوم القوة الغاشمة سيستغرق 352 عامًا فقط بدلاً من 467 عامًا؟(هناك نكتة قصصية.) إن القيمة التي سيتم اكتسابها (عدم تخزين كلمة المرور في نص عادي على النظام) تفوق بكثير اهتمام زميلك.

آمل أن تسامحني على توصيل الحل الذي كتبته حول هذا الأمر، باستخدام JavaScript من جانب العميل لتجزئة كلمة المرور قبل إرسالها: http://blog.asgeirnilsen.com/2005/11/password-authentication-without.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top