ما الخوارزمية التي يجب أن أستخدمها لتجزئة كلمات المرور في قاعدة البيانات الخاصة بي؟[ينسخ]

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

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

هل هناك أي شئ المتاحة التي ليست قابلة للكسر تافهة؟

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

المحلول

لقد أصبحت إجابة عام 2008 هذه قديمة بشكل خطير. أصبح SHA (جميع المتغيرات) الآن قابلاً للكسر بشكل تافه، وأفضل الممارسات الآن (اعتبارًا من يناير 2013) هي استخدام تجزئة تمديد المفتاح (مثل PBKDF2) أو بشكل مثالي تجزئة كثيفة ذاكرة الوصول العشوائي (مثل بكريبت) ولإضافة الملح لكل مستخدم أيضًا.

لا تزال النقاط 2 و 3 و 4 تستحق الاهتمام بها.

انظر موقع أمن تكنولوجيا المعلومات SE للمزيد من.


الإجابة الأصلية لعام 2008:

  1. استخدم خوارزمية مجربة.يستخدم SHA-256 64 حرفًا في قاعدة البيانات، ولكن مع وجود فهرس في العمود لا يمثل مشكلة، وهو تجزئة مثبتة وأكثر موثوقية من MD5 وSHA-1.ويتم تطبيقه أيضًا بمعظم اللغات كجزء من مجموعة الأمان القياسية.ومع ذلك، لا تشعر بالسوء إذا كنت تستخدم SHA-1.

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

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

  4. لا تكتب سجلات مثل "[AddUser] Hash of GeorgeBush:Rep4Lyfe:ASOIJNTY is xyz"

نصائح أخرى

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

القواعد الأساسية:

  1. لا تقم مطلقًا بتخزين كلمة مرور نصية عادية (مما يعني أنه لا يمكنك أبدًا عرضها أو إرسالها أيضًا).
  2. لا تقم أبدًا بإرسال التمثيل المخزن لكلمة المرور عبر خط غير آمن (إما نص عادي أو مشفر أو مجزأ).
  3. السرعة هي عدوك.
  4. إعادة التحليل بانتظام و تحسين العملية الخاصة بك مع تحسن الأجهزة وتحليل الشفرات.
  5. التشفير والعملية هي صغير جدًا جزء من الحل.
  6. نقاط الفشل تشمل:التخزين، والعميل، والنقل، والمعالجة، والمستخدم، والأوامر القانونية، والتطفل، والمسؤولين.

خطوات:

  1. فرض بعض متطلبات الحد الأدنى المعقول لكلمة المرور.
  2. قم بتغيير كلمات المرور بشكل متكرر.
  3. استخدم أقوى تجزئة يمكنك الحصول عليها - شا-256 تم اقتراحه هنا.
  4. اجمع كلمة المرور مع أ ملح ثابت (نفس الشيء بالنسبة لقاعدة البيانات بأكملها).
  5. الجمع بين نتيجة الخطوة السابقة مع ملح فريد (ربما اسم المستخدم، أو معرف السجل، أو الدليل، أو الرقم العشوائي الطويل، وما إلى ذلك) الذي يتم تخزينه وإرفاقه بهذا السجل.
  6. قم بتشغيل خوارزمية التجزئة عدة مرات - مثل 1000+ مرات.من الأفضل أن تضيف ملحًا مختلفًا في كل مرة مع التجزئة السابقة.السرعة هي عدوك والتكرارات المتعددة تقلل السرعة.قم بمضاعفة التكرارات بين الحين والآخر (وهذا يتطلب التقاط تجزئة جديدة - افعل ذلك في المرة القادمة التي يغيرون فيها كلمة المرور الخاصة بهم).

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

كان لدى CodingHorror مقالة رائعة عن هذا العام الماضي

http://www.codinghorror.com/blog/archives/000953.html

التوصية في نهاية المقال هي BCrypt

الخوارزميات المذكورة أعلاه هي خوارزميات تجزئة آمنة تشفيريًا (لكن MD5 لا تعتبر آمنة اليوم).

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

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

استخدم دالة تجزئة تشفيرية قوية مثل MD5 أو SHA1، لكن تأكد من استخدام دالة جيدة ملح, ، وإلا فسوف تكون عرضة لذلك طاولة قوس قزح الهجمات.

تحديث يناير 2013

الجواب الأصلي هو من عام 2008، وقد تغيرت الأمور قليلاً في السنوات الخمس الماضية.إن التوفر الجاهز للحوسبة السحابية وبطاقات الرسومات القوية ذات المعالج المتوازي يعني أن كلمات المرور التي تصل إلى 8 أو 9 أحرف مجزأة كـ MD5 أو SHA1 أصبحت الآن قابلة للكسر بشكل تافه.

الآن أصبح الملح الطويل أمرًا ضروريًا، كما هو الحال مع شيء أكثر صرامة مثل SHA512.

ومع ذلك، تم تصميم جميع تجزئات SHA المتنوعة لتشفير الاتصالات - الرسائل ذهابًا وإيابًا حيث يتم تشفير كل رسالة، ولهذا السبب تم تصميمها لتكون سريع.

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

يمكن إنشاء تجزئة سريعة مثل SHA512 ملايين، بل مليارات المرات في الثانية.استخدم المعالجة المتوازية الرخيصة وسيصبح كل تبديل ممكن لكلمة المرور ضرورة مطلقة.

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

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

لذا:

ما الخوارزمية التي يجب أن أستخدمها لتجزئة كلمات المرور في قاعدة البيانات الخاصة بي؟

  • تمديد المفتاح لإبطاء توليد التجزئة.ربما سأختار PBKDF2.

  • الملح لكل مستخدم يعني هجومًا جديدًا لكل مستخدم، ويعمل البعض على معرفة كيفية الحصول على الملح.

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

الأصل في سبتمبر 2008 (يُترك حتى تكون التعليقات منطقية)

MD5+salt أو SHA1+salt ليس "قابلاً للكسر بشكل تافه" - تعتمد معظم الحيل على طاولات قوس قزح الضخمة وتصبح أقل فائدة مع الملح [update, now they are].

يعد MD5+salt خيارًا ضعيفًا نسبيًا، لكن لن يتم كسره بسهولة [update, now it is very easy to break].

يصل SHA2 إلى 512 - سيكون من المستحيل اختراقه باستخدام الأدوات المتوفرة بسهولة [update, pretty easy up to 9 char passwords now] - على الرغم من أنني متأكد من وجود Cray في أحد المخبأ العسكري في مكان ما يمكنه القيام بذلك [You can now rent this 'Cray' from Amazon]

MD5 أو SHA مع قيمة ملح يتم إنشاؤها بشكل عشوائي لكل إدخال

كما ذكرنا سابقًا، لا ينبغي استخدام خوارزميات التجزئة البسيطة هنا، وهذا هو السبب:

http://arstechnica.com/security/2012/08/passwords-under-assault/

لذا استخدم شيئًا آخر مثل http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

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

ولكن، إذا كنت على استعداد لقبول التهديد بهجوم على القاموس، فسيكون كل من MD5 وSHA1 أكثر من كافٍ.يعتبر SHA1 أكثر أمانًا، ولكن بالنسبة لمعظم التطبيقات، لا يعد هذا تحسنًا كبيرًا.

تعد تجزئات MD5 / SHA1 خيارين جيدين.MD5 أضعف قليلاً من SHA1.

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