
سنرى اليوم أفضل طريقة لتخزين كلمات المرور في قاعدة بيانات وكيف تعمل المنصات المعروفة على حل هذه المشكلة.
نص عادي
عندما نشأ السؤال عن تخزين كلمات المرور ، بالطبع ، كانت الفكرة الأولى هي ببساطة كتابتها مفتوحة في لوحة الاسم المناسبة في قاعدة البيانات. وسيكون كل شيء على ما يرام إذا لم يتمكن العملاء حقًا من الوصول إليه مباشرة. ولكن ، لسوء الحظ ، لا يزال حقن SQL المعروف هذا يعمل أحيانًا في تطبيقات الويب المختلفة ، ناهيك عن نقاط الضعف المحتملة الأخرى. في الأمور الأمنية ، من المقبول عمومًا افتراض الأسوأ وإعداد خطة عمل وحماية حتى في مثل هذه الحالة. نفترض أن أحد المهاجمين وجد ثغرة في تطبيق ويب ، بطريقة أو بأخرى ، يقوم بإفراغ تحميل جدول بأسماء المستخدمين وكلمات المرور ثم يتخلص منها كما يشاء. بشكل عام ، قد تكون إجراءاته الإضافية على النحو التالي:
- تنفيذ إجراءات غير مشروعة نيابة عن المستخدمين باستخدام بيانات اعتمادهم على مورد معرض للخطر: على سبيل المثال ، البطاقة المصرفية مرتبطة بحساب ، ويمكن للمهاجم الآن استخدامها ؛
- محاولة استخدام كلمة المرور المستلمة على الموارد الأخرى: بعيدًا عن المستخدمين دائمًا ، بعد اتباع النصائح ، يبتكرون كلمات مرور جديدة لخدمات مختلفة في كل مرة ؛
- محاولة لتحديد قاعدة إنشاء كلمة مرور والانتقال إلى النقطة الثانية: بعضها يشكل قاعدة لإنشاء كلمة مرور ، ونتيجة لذلك ، تختلف كلمات المرور على الموارد المختلفة ، ولكنها تتبع نفس القاعدة التي يمكن اكتشافها ؛
- تصعيد الامتيازات: يمكن أيضًا تخزين كلمة مرور المسؤول في نفس الجدول ، مع العلم أنه يمكنك أحيانًا التحكم الكامل في الخادم.
تجزئة التشفير
وتبين أن الفكرة ليست جيدة على الفور. ماذا تفعل سيكون من الرائع تخزين كلمات المرور في شكل مشفر. بعد ذلك ، حتى إذا تمت إزالتهم ، فلن يتمكنوا من التعافي ، أو على الأقل سيقضون الكثير من الوقت في ذلك. هنا ينشأ الاختيار بين فرعين للتطوير: تشفير كلمات المرور أو التجزئة. استقر المطورون في الثاني ، ومن حيث المبدأ ، من الواضح لماذا. قارن بين المتقدمين للحصول على خصائص مختلفة:
- إدخال العمل. يستغرق التشفير مزيدًا من الوقت ، وبغض النظر عن التحويل الذي نختاره ، يجب أن يتم ذلك مع كل تدقيق لكلمة المرور. أحد متطلبات وظائف التجزئة هي سرعة التنفيذ.
- طول قيم الإخراج. تكون نتيجة التشفير متغيرة في الطول ، وتكون نتيجة التجزئة دائمًا هي نفسها ، وتخزين البيانات الموحدة في قاعدة بيانات أمر مريح للغاية. ناهيك عن حقيقة أن طول كلمة المرور في شكل مشفر سيعطي بعض المعلومات حول طول كلمة المرور الأصلية. ومع ذلك ، فإن الطول نفسه يؤدي إلى إمكانية حدوث تصادمات ، ولكن أكثر من ذلك أدناه.
- إدارة المفاتيح. يتطلب التشفير مفتاحًا ، والذي يجب أيضًا تخزينه في مكان ما ونأمل ألا يعثر عليه أحد. على أي حال ، يعد توليد المفاتيح وإدارتها قصة منفصلة (يجب ألا تكون ضعيفة ، بل يجب تغييرها بانتظام ، وما إلى ذلك).
- إمكانية الصراع. عند التشفير ، سيكون الناتج من بيانات الإدخال المختلفة دائمًا مختلفًا أيضًا. مع التجزئة ، ليس هذا هو الحال دائمًا. طول التجزئة الثابت يعني أن مجموعة قيم الإخراج لدالة التجزئة محدودة ، مما يؤدي إلى إمكانية التصادم. بمعنى ، لنفترض أن المستخدم قد اختلط عليه الأمر بالفعل وأخرج بكلمة مرور طويلة رائعة حقًا ، والتي تحتوي على أحرف وأرقام وأحرف خاصة في حالة الأحرف الكبيرة والصغيرة. يقوم المهاجم بإدخال كلمة مرور "admin" لا تقل برودة في حقل كلمة المرور. قام الخادم بتجزئتها لفحص ومقارنة التجزئة. مطابقة تجزئات. إنه لأمر مخز.
وهكذا ، برصيد 3: 1 ، يفوز التجزئة. ولكن هل من الممكن التوقف عند هذا الحد؟
الجواب لا.
هجمات كلمة المرور المجزأة
لذا ، حصل المهاجم على طاولتنا بأسماء المستخدمين وكلمات المرور. تم تجزئة كلمات المرور الآن ، لكن هذا لا يمنع مهاجمنا ، وهو ينوي بجدية استعادتها. أفعاله المحتملة:
- قسوة القاموس: إذا لم ينجح المهاجم بكلمة المرور المرجعية الخاصة بالمسؤول ، فسوف يلجأ إلى قاموس كلمات المرور الشائعة ويجرب حظه مع التجزئة.
- جداول قوس قزح: بشكل عام اليوم ، ربما لن يحتاج إلى حساب أي شيء وفرزها من خلال القاموس. سيكون كافيا التحول إلى طاولات قوس قزح الملقاة على الشبكة. تحتوي جداول قوس قزح على قيم تجزئة محسوبة بالفعل من قبل شخص ما وبيانات الإدخال المقابلة لها. من المهم ملاحظة أنه بسبب التصادمات ، لن تكون كلمة المرور التي سيقدمها جدول قوس قزح بالضرورة هي التي يستخدمها المستخدم. القيم المحسوبة هي بالفعل لـ MD5 و SHA1 و SHA256 و SHA512 ، بالإضافة إلى تعديلاتها وبعضها الآخر. يمكنك محاولة عكس التجزئة ، على سبيل المثال ، هنا ؛
- بحث شامل: إذا لم يساعد هذا ، فسيتعين عليك اللجوء إلى القوة الغاشمة وفرز جميع كلمات المرور الممكنة على التوالي حتى تتطابق التجزئة المحسوبة في النهاية.
في الحالة العامة ، سيتعين على المهاجم اختراق كلمات المرور. وهنا يعتمد نجاحها ، من بين أمور أخرى ، على سرعة حساب دالة التجزئة. يمكن العثور على مقارنة لوقت التجزئة
هنا . على سبيل المثال ، تم تشغيل وظائف التجزئة التي تم تنفيذها بواسطة Java في نظام التشغيل Windows 10 64 بت مع معالج Intel i7 2.60GHz وذاكرة وصول عشوائي سعتها 16 جيجابايت مليون مرة لحساب تجزئة مكونة من 36 حرفًا. أظهروا النتائج التالية:
MD5 - 627 مللي ثانية
SHA-1 - 604 مللي ثانية
SHA-256-739 مللي ثانية
SHA-512 - 1056 مللي ثانية
لكن اليوم ، يمكن موازاة القوة الوحشية وتشغيلها بشكل أسرع عدة مرات على GPU (وكذلك على APU و DSP و FPGA). ومع ذلك ، بالإضافة إلى اختيار خوارزمية أطول وإخراج أطول ، يمكنك القيام بشيء آخر.
تجزئة التجزئة
لمنع المهاجم من استخدام طاولات قوس قزح الجاهزة ، هناك تقنية لتجزئة كلمة المرور عدة مرات. أي أننا نحسب التجزئة من التجزئة من التجزئة ... وهكذا n مرات (من الضروري ، مع ذلك ، عدم التورط في هذا الأمر ، لأنه سيتعين على الخادم أيضًا القيام بذلك أثناء التحقق المنتظم من كلمة مرور المستخدم). الآن الأمر بسيط جدًا وفقًا لجدول قوس قزح لن يجد كلمة المرور ، وسيزداد وقت القوة الغاشمة بشكل كبير. ولكن لا شيء يمنع المهاجم من إنشاء جدول قوس قزح من قاموس كلمات المرور ، مع معرفة خوارزمية التجزئة. علاوة على ذلك ، بالنسبة للمجموعات الأكثر شيوعًا من هذه الطريقة ، تم إنشاء هذه الجداول بالفعل:

"
أضف الملح حسب الذوق
حتى لا يتمكن من فعل ذلك ، يتم تجزئة كلمات المرور اليوم بإضافة الملح.
الملح عبارة عن سلسلة عشوائية إضافية يتم تعيينها لكلمة مرور وتجزئتها. لا يمكنك استعادة كلمة المرور من التجزئة التي تم الحصول عليها من جدول قوس قزح. بمعرفة الملح وتجزئة الإخراج ، فإن المهاجم محكوم عليه بالقوة الغاشمة ولن تساعده على الأرجح الجداول المحسوبة مسبقًا.
تصنيف تمليح كلمة المرور:
1. حسب مبدأ التمليح:
- ملح فريد لكل مستخدم: فرد لكل مستخدم - بهذه الطريقة ، إذا أصبح المهاجم معروفًا للمهاجم ، فيجب أن يتم تخمين كل كلمة مرور. بالإضافة إلى ذلك ، حتى لو فكر مستخدمان بنفس الطريقة وخلصا بكلمات مرور متطابقة ، فستظل التجزئات مختلفة في الإخراج ؛
- الملح العالمي: نفس الشيء بالنسبة لجميع أنواع التجزئة ؛
- هذا وذاك.
2. حسب طريقة تخزين الملح:
- في قاعدة البيانات: كقاعدة ، يتم تخزين الأملاح الفردية في نفس قاعدة البيانات مثل تجزئات كلمة المرور ؛ في كثير من الأحيان حتى على نفس الخط ؛
- في الكود (اقرأ: في التكوين): عادة ما يتم تخزين الملح العالمي ليس في قاعدة البيانات ، ولكن ، على سبيل المثال ، في التكوين ، بحيث يضطر المخالف إلى قضاء بعض الوقت في اختياره.
نفترض أن أملاح المستخدم الفردية يتم تخزينها في قاعدة البيانات ، والملح العالمي في التكوين. تمكن المهاجم من الوصول إلى قاعدة البيانات ، وهو يعرف كل التجزئة والأملاح المقابلة لها (لا يتم تخزين الملح العالمي في قاعدة البيانات ، ولا يعرف ذلك). في المجموع ، إذا تم الجمع بين جميع الطرق ، من أجل الحصول على كلمات المرور في شكل واضح ، كما كان الحال في الأنظمة الأولى ، فسيواجه العقبات التالية:
- إنه لا يعرف الملح العالمي ، لذلك يجب أن يتم تعذيبه.
- إنه يعرف أملاح المستخدمين ، لكنه ليس لديه جداول معدة لهذه الأملاح ، لذلك سيكون عليه كسر كلمات المرور.
- ستستغرق هذه العملية وقتًا أطول نظرًا لضرورة تجزئة التجزئة n مرات.
كيف تخزن كلمات المرور مختلف أنظمة إدارة المحتوى
وورد
قبل الإصدار 3.x ، تم تجزئة كلمات المرور ببساطة باستخدام MD5. الآن يتم استخدام مكتبة phpass. بشكل افتراضي ، يتم تعيين الملح لكلمة المرور في المقدمة ويتم تجزئة السلسلة الناتجة MD5 2 ^ 8 مرات.
جملة
قبل الإصدار 1.0.12 ، تم استخدام MD5 فقط. يتم استخدام مكتبة phpass بشكل افتراضي bcrypt مع الملح و 2 ^ 10 التكرار.
دروبال
حتى الإصدار 6 MD5 بدون ملح. يتم استخدام مكتبة phpass. الافتراضي هو sha512 المملح مع 2 ^ 16 التكرار.
شريط فضي
يستخدم السمكة السمكية المالحة مع 2 ^ 10 ممثلين.
أومبراكو
يستخدم HMACSHA256 بالملح. يستخدم الملح العالمي الثاني المحدد في التكوين.