كنت أرغب دائمًا في عدم تمكن المخترق من اختراق كلمة مرور شخص آخر على الموقع.
على سبيل المثال ، إذا تفاخر المستخدم أمام أحد المتطفلين بأن كلمة المرور الخاصة به تتكون فقط من أرقام ، فسيفقد المستخدم حسابه قريبًا.
ولكن ماذا لو أخبر المستخدم زوجته عن طريق الهاتف بكلمة المرور الخاصة به وسمعها المخترق؟
ماذا؟! هل يعرف المخترق كلمة المرور؟ كل هذا فشل ذريع. هل يمكنك مساعدة مثل هذا المستخدم في زيادة صعوبة اختراق حسابه؟ لطالما كنت قلقًا بشأن هذا السؤال وأعتقد أنني وجدت طريقة للقيام بذلك. أو أعاد اكتشافه ، كما هو الحال غالبًا. بعد كل شيء ، تم اختراع كل شيء قبلنا منذ فترة طويلة.
استهلالي
- يريد المستخدم الحصول على كلمة مرور على موقع "12345".
- يمكن للمتسلل تخمين كلمة المرور هذه بسهولة.
- لكن يجب على المستخدم تسجيل الدخول ، ولا يقوم المتسلل بذلك. حتى لو كان المخترق يعرف معلومات تسجيل الدخول وكلمة المرور.
- ولا توجد رسائل SMS بأكواد سرية ووسطاء في شكل خدمات إضافية. فقط المستخدم والموقع الخاص بك مع صفحة تسجيل الدخول.
- وسيكون من الآمن نسبيًا أن تقول لزوجتك في عربة ترولي باص: "جاليا ، لقد غيرت كلمة المرور إلى 123456 على موقع الويب لتسجيل الدخول إلينا - يقولون إنها أكثر شهرة من 12345 لدينا". ولا تخف من اختراق حسابك في ثانية.
كيف تعمل الطريقة؟ كل التفاصيل تحت الخفض.
ما هو المطلوب؟
- المفهوم يشرح فقط طريقة المصادقة
- يتطلب التطبيق تخزين " اسم المستخدم " و " كلمة المرور " و " ملح 1 " و " ملح 2 " فقط . نعم ، ملحان.
- redis
- IP-
- SMS
- . , — , . , . , ?
- . , .
- (, ).
اسمح للمستخدم بالحصول على كلمة المرور "12345" ، وجعل اختراق كلمة المرور أكثر صعوبة. على سبيل المثال ، كيفية تخمين كلمة مرور تبدو وكأنها تجزئة.
كيف؟
تخيل لو كان المتصفح دائمًا يتمتع بملح فريد يمكن استخدامه لملح كلمة المرور. ملح لكل مستخدم. لماذا هو مطلوب؟ لتشفير. على سبيل المثال ، إذا قمت بتشفير السلسلة "12345" باستخدام الملح "saltsalt" في argon2id ، فستحصل على "$ argon2id $ v = 19 $ m = 16، t = 2، p = 1 $ c2FsdHNhbHQ $ jX94laSi6vo9AhS + bHwbkg" تغيير الملح و التجزئة سيكونان مختلفين. ستقوم خوارزمية واحدة بتشفير نفس كلمات المرور بشكل مختلف باستخدام ملح مختلف لكل منها. حسن.
لكن من أين تحصل على هذا الملح في البداية؟ نعم ، ها هي جالسة أمام الشاشة. دعه يضغط على حرفين أو ثلاثة أحرف إضافية وتسجيل الدخول أخيرًا بطريقة بشرية. هل هناك قط يركض؟ حسنًا ، لنأخذ قطة. ما هو القط؟ هذه هي كلمتنا السرية. سوف نرسلها إلى الخادم أثناء التسجيل ، وسوف تولد ملحًا لهذه الكلمة. وبعد ذلك سيرسل لنا هذا الملح. هذا كل شيء - المتصفح به ملح. الآن كلمة المرور. ونقوم أيضًا بتشفير كلمة المرور وملحها بالملح الذي أرسله الخادم.
الآن نحن لسنا خوذة "12345". نرسل التجزئة ، وبما أن كل مستخدم لديه ملح خاص به ، فإن التجزئة مختلفة.
يبدو أن القوة الغاشمة ستمرض الآن: لن تضطر فقط إلى إجراء حسابات إضافية والتكرار عبر سلاسل طويلة من تجزئة الأرجون بدلاً من الأرقام البسيطة ، ولكن أيضًا سيكون لكل مستخدم تجزئة خاصة به - الآن لا جدوى من تجربة نفس السلسلة ككلمة المرور للتحقق من ذلك للجميع المستخدمين. لنفترض أن ثلاثة مستخدمين قد اختاروا نفس كلمة المرور: 12345. لكن التجزئة الخاصة بهم ستكون مختلفة. لأن كل شخص لديه ملح مختلف.
- يجب على المتصفح حساب تجزئة كلمة المرور باستخدام الملح الذي أرسله الخادم مسبقًا. يجب أن يرسل هاش ، وليس كلمة المرور نفسها.
- يرسل الخادم الملح باستخدام كلمة سرية لا يعرفها إلا المستخدم. يمكن أن تكون بسيطة. على سبيل المثال - "قطة".
- يجب أن يكون لكل مستخدم ملح خاص به.
- يجب أن يكون للاثنين من المستخدمين الذين اختاروا نفس الكلمة السرية ملح مختلف.
- لا يتعين على الخادم الإبلاغ عما إذا تم استخدام الكلمة السرية الصحيحة وما إذا كانت كلمة المرور صحيحة لهذا المستخدم - وإلا فسيتم فرض كلمتين من كلمات المرور البسيطة بدلاً من كلمة مرور واحدة.
- إذا قام المستخدم بتغيير الكلمة السرية ، يتغير الملح أيضًا.
أي لحماية كلمة المرور البسيطة الخاصة به ، يجب على المستخدم أن يأتي بكلمة أخرى بسيطة للغاية. يقوم بإدخال هذه الكلمة في أي مكان يريد المصادقة عليه ، وعندها فقط يلزم إدخال كلمة المرور. حتى يزيل ملفات تعريف الارتباط.
- ذهب إلى الموقع
- دخلت تسجيل الدخول وكلمة سرية
- أدخلت كلمة المرور
- جاهز
يمكن أن تكون كلمة المرور والكلمة السرية في غاية البساطة. حرف أو حرفان. على سبيل المثال ، كلمة المرور هي 12345 والكلمة السرية 42. وإذا جاء شخص آخر بكلمة السر 42 ، فلن يكون الأمر مخيفًا.
كيف تعمل. مفهوم خطوة بخطوة
لدينا العناصر التالية:
- قاعدة بيانات للانترنت
- قاعدة البيانات وجدول المستخدمين:
- تسجيل الدخول
- password_hash
- ملح_فريد_لجميع_المستخدم
- Salt_for_password
- متصفح المستخدم
- متصفح القراصنة
- صفحات تسجيل الدخول والتسجيل بالموقع
- البرنامج النصي الذي يعترض حدث الإرسال لنموذج تسجيل الدخول
بعد ذلك ، نحتاج إلى خوارزميتين مختلفتين يمكن تنفيذهما حتى على نفس نظام التشفير ، ببساطة باستخدام معلمات مختلفة:
- ALG1 هي خوارزمية تشفير غير متماثلة تنشئ تجزئة من سلسلة وملح. ALG1 (str ، ملح) = تجزئة 1. يتم استخدام هذه الخوارزمية فقط على الخادم.
- ALG2 هي خوارزمية تشفير غير متناظرة تنشئ تجزئة من سلسلة وملح. ALG2 (str ، ملح) = تجزئة 2. تُستخدم هذه الخوارزمية علنًا ويجب أن يكون من الممكن تنفيذها على العميل (في مثالنا ، في جافا سكريبت).
بالإضافة إلى ذلك ، نحتاج إلى خوارزميتين أبسط:
- ALG_SALT هي خوارزمية تحسب الملح العشوائي كسلسلة أحرف. ALG_SALT () = ملح. يتم استخدام هذه الخوارزمية فقط على الخادم.
- ALG_PASS هي خوارزمية تنشئ كلمة مرور عشوائية بسيطة. ALG_PASS () = تمرير. يتم استخدام هذه الخوارزمية فقط على الخادم.
الأحداث خطوة بخطوة
- ينتقل المستخدم إلى صفحة التسجيل لأنه ليس لديه تسجيل دخول حتى الآن.
- يعرض الخادم نموذجًا يحتوي على حقلين: تسجيل الدخول + كلمة سرية بسيطة.
- يختار المستخدم تسجيل الدخول - أليس
- يختار المستخدم الكلمة السرية - القط
- يقوم المستخدم بالنقر فوق الزر إرسال .
يتحقق الخادم ويتأكد من عدم وجود مستخدم أليس في قاعدة البيانات.
يحسب الخادم القيم التالية:
$salt_unique_for_each_user = ALG_SALT(); // "saltsalt"
$salt_for_password = ALG1("cat", $salt_unique_for_each_user); // "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg"
$user_simple_password = ALG_PASS(); // "12345"
$user_simple_password_hashed = ALG2($user_simple_password , $salt_for_password); // "$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ"
ينشئ الخادم سجلاً في جدول المستخدمين ويحفظ البيانات:
INSERT INTO `users`
(
login,
password_hashed,
salt_unique_for_each_user,
salt_for_password
)
VALUES
(
"alice",
"$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ",
"saltsalt",
"$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg"
).
يعرض الخادم للمستخدم صفحة نجاح التسجيل مع الرسالة: "تم إنشاء المستخدم بنجاح. استخدم كلمة المرور المؤقتة 12345 لتسجيل الدخول. "
يصرخ المستخدم بسعادة: "مرحباً ، لقد سجلت في الموقع تحت الاسم المستعار أليس وأعطوني كلمة المرور 12345. يا لها من كلمة مرور بسيطة ومضحكة!". لكن شقة المستخدم عازلة للصوت سيئة للغاية ، وسمع جاره المتسلل كل شيء.
- يدفع المخترق عنوان موقع الويب إلى متصفحه.
- يرسل متصفح المتسلل ملفات تعريف الارتباط الفارغة.
- يتحقق الخادم من طلب المخترق لمعرفة ما إذا كان هناك ملف تعريف ارتباط "ملح". لا تجدها.
- قبل أن يرسل المخترق اسم المستخدم وكلمة المرور المسروقين ، يحتاج المتصفح إلى معرفة الملح لتشفير كلمة المرور به.
- متصفح المخترق لا يخزن الملح في ملف تعريف الارتباط "الملح".
- يرسل الخادم استمارة تسجيل الدخول مع حقلين: تسجيل الدخول + كلمة السر لتمكين المستخدم من الحصول على الملح.
الهاكر مرتبك. دعنا نتركه الآن.
- يتم إرجاع المستخدم إلى صفحة تسجيل الدخول.
- يرسل متصفح المستخدم ملفات تعريف الارتباط الفارغة.
- يتحقق الخادم من طلب المستخدم لمعرفة ما إذا كان هناك ملف تعريف ارتباط "ملح". لا تجدها.
- قبل أن يرسل المستخدم اسم مستخدم وكلمة مرور ، يجب أن يعرف المتصفح الملح من أجل تشفير كلمة المرور به.
- لا يقوم متصفح المستخدم حتى الآن بتخزين الملح في ملف تعريف الارتباط "الملح".
- يرسل الخادم استمارة تسجيل الدخول مع حقلين: تسجيل الدخول + كلمة السر لتمكين المستخدم من الحصول على الملح.
- يقوم المستخدم بإدخال تسجيل الدخول - أليس ، سري - القط ثم ينقر على زر " إرسال ".
يتلقى الخادم الطلب ويرى أنه تم إرسال كلمة سرية بدلاً من كلمة المرور.
- يختار الخادم سجلاً من قاعدة البيانات مع تسجيل دخول - أليس ويأخذ القيم ` Salt_unique_for_each_user` -> $ db_salt_unique_for_each_user و` salt_for_password -> $ db_salt_for_password`.
- يقوم الخادم بإجراء عمليات حسابية مشابهة لتلك التي قام بها أثناء التسجيل. تحسب القيمة: $ salt_for_password = ALG1 ("cat"، $ db_salt_unique_for_each_user).
- يرسل الخادم قيمة الملح $ Salt_for_password ردًا على المستخدم. هذا الملح صحيح. إذا قمت بتشفير كلمة المرور 12345 بها ، فستحصل على تجزئة مخزنة الآن في قاعدة البيانات. تشير رؤوس الاستجابة من الخادم إلى - `تعيين ملف تعريف الارتباط = $ db_salt_for_password`. لنحفظ أيضًا تسجيل الدخول: `تعيين تسجيل الدخول لملف تعريف الارتباط =" أليس "`.
توضيح : الخادم لا يخطر بأي طريقة تم إرسال الملح - صحيح أم لا. ستكون نتيجة استخدامه واضحة عندما يحاولون تسجيل الدخول باستخدام اسم المستخدم وكلمة المرور الصحيحين.
- يتلقى المستخدم استجابة الخادم. يتم إعادة تحميل صفحتها أو تغييرها ديناميكيًا على الفور.
- : login = alice, salt = "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg".
- — “salt”. .
- , .
- : ( alice) + .
- 12345 "".
- onSubmit.
- $password_hashed = ALG2(«12345», "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg").
- إرسال البيانات "alice" / $ argon2id $ v = 19 $ m = 16، t = 2، p = 1 $ JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvHOUFoAUFo
يتلقى الخادم طلب مصادقة:
- بيانات تسجيل الدخول + كلمة المرور: "أليس" / $ password_hashed
- ينتقل إلى قاعدة البيانات ويحصل على القيمة ` password_hashed` -> $ db_password_hashed.
- يقارن $ db_password_hashed === $ password_hashed؟
- مطابقة تجزئة ، التفويض ناجح.
ملاحظة: في المثال الخاص بي ، يقارن الخادم التجزئة مباشرة. لكن لا يمكنك تخزين السلاسل في قاعدة البيانات التي هي في الواقع كلمات مرور بالفعل. يمكن سرقتها ثم استخدامها في شكل كلمة مرور تسجيل الدخول. لذلك ، تحتاج إلى تجزئة - بغض النظر عن مدى غرابة ذلك. هذا يعني أنك بحاجة إلى ملح ثالث. ولكن لا يجب تخزينها في قاعدة البيانات ، ولكن في متغير البيئة. ومع ذلك ، فهذه هي بالفعل تفاصيل التنفيذ التي تركتها للبساطة.
في غضون ذلك ، قرر المخترق اختبار نموذج تسجيل الدخول الغريب هذا:
- يقوم المخترق بإدخال معلومات تسجيل الدخول - أليس ، كلب سري ، ثم ينقر على زر " إرسال ".
- يتلقى الخادم طلب المتسلل ويرى أنه تم إرسال كلمة سرية بدلاً من كلمة المرور.
- — alice `salt_unique_for_each_user` -> $db_salt_unique_for_each_user `salt_for_password` -> $salt_for_password.
- , , : $result_fake_salt = ALG1(«dog», $db_salt_unique_for_each_user). , .
يرسل الخادم قيمة الملح المحسوبة مرة أخرى إلى متصفح المستخدم. تشير الرؤوس إلى - `تعيين ملح ملف تعريف الارتباط = $ result_fake_salt`. يتم أيضًا حفظ تسجيل الدخول: `تعيين تسجيل دخول ملف تعريف الارتباط =" أليس "`.
التفسير : لمساعدة المخترق في عمله الشاق يرسل له الخادم الملح. لكن من المستحيل تحديد ما إذا كانت الكلمة السرية صحيحة أم لا.
- يتلقى المخترق استجابة الخادم. يتم إعادة تحميل صفحتها أو تغييرها ديناميكيًا على الفور.
- يرسل متصفح المخترق ملفات تعريف الارتباط: login = alice ، salt = $ result_fake_salt .
- يتحقق الخادم من طلب المستخدم لمعرفة ما إذا كان هناك ملف تعريف ارتباط "ملح". يجدها.
- متصفح المخترق يحتوي بالفعل على ملح لتشفير كلمة المرور.
- : ( alice) + .
- 12345 "".
- onSubmit.
- $password_hashed = ALG2(«12345», $result_fake_salt).
- «alice»/$password_hashed.
يتلقى الخادم طلب مصادقة - "أليس" / $ password_hashed.
ينتقل إلى قاعدة البيانات ويحصل على القيمة `password_hashed` -> $ db_password_hashed.
يقارن: $ password_hashed === $ db_password_hashed؟ لا.
لا تتطابق تجزئات كلمات المرور المتطابقة في البداية. لأنها كانت مملحة بطرق مختلفة.
الهاكر لا يستسلم ويذهب لتسجيل مستخدم آخر على الموقع.
بالصدفة ، أدخل نفس الكلمة السرية مثل المستخدم خلف الحائط - القط .
يحصل المخترق على كلمة مرور صالحة للحساب الجديد ، ويحاول استبدالها في نص التجزئة.
لحسن الحظ ، استخدم إنشاء كلمة المرور ملحًا ثانيًا (`salt_unique_for_each_user`) ، والذي تم إنشاؤه بطريقة جديدة لكل مستخدم. لذا فإن المستخدمين المختلفين ، حتى باستخدام نفس كلمات المرور - والأهم من ذلك - الكلمات السرية ، سيكون لديهم أملاح مختلفة. وملح المستخدم بنفس الكلمة السرية لن يضاهي ملح آخر. ولن تكون مطابقة كلمات المرور مشكلة أيضًا.
الآن ، فيما يتعلق بتعقيد كلمات مرور القوة الغاشمة في القاموس. إذا قمنا بتعديل ALG2 ، وهو أمر شائع لكل من الخادم والعميل ، وجعلناه مرهقًا ، فسيؤدي ذلك إلى تعقيد هجوم المتسلل بشكل خطير. دعني أذكرك أن ALG2 هي عملية الحصول على تجزئة كلمة المرور التي يتم إرسالها إلى الخادم. على الخادم ، تم بالفعل حساب هذه التجزئة وتخزينها في قاعدة البيانات:
- سيقوم الخادم بإجراء عملية ALG2 مرة واحدة فقط عند كتابة كلمة مرور لقاعدة البيانات أو تغيير كلمة المرور إلى كلمة مرور جديدة
- سيقوم العميل بتنفيذ عملية ALG2 فقط أثناء المصادقة (والتي يجب عدم الخلط بينها وبين التفويض). لنفترض أن العميل قد أخطأ عدة مرات عند إدخال كلمة المرور - لا بأس بذلك.
- سيقوم المخترق بذلك طوال الوقت لكل كلمة مرور ، والتي يمكن تهنئته عليها. من المثير للسخرية بشكل خاص بذل جهد هائل على كلمات مرور مثل 123/1234/12345.
في الأجهزة الضعيفة ، يمكن أن تستغرق العملية وقتًا أطول بكثير من تلك السريعة. هذا يمكن أن يكون مشكلة. لذلك لا داعي لتعقيد الخوارزمية.
سأنهي وصف المفهوم ببرميل من القطران:
- إذا قام المستخدم بإدخال كلمة سرية عن طريق الخطأ ، فسيكون في موقف لا يمكنه فيه الدخول باستخدام كلمة المرور الخاصة به. سيتعين عليك إعادة تعيين الكلمة السرية (في حالتنا ، حذف ملفات تعريف الارتباط) وإرسال الطلب مرة أخرى. يمكن تنفيذ ذلك بشفافية عن طريق الضغط على زر واحد ، ولكن قبل ذلك يجب على المستخدم التخمين. يمكنك فرض إعادة تعيين في 5 محاولات تسجيل دخول غير صحيحة.
- سيتعين على اثنين من المستخدمين على نفس الكمبيوتر التخلص من ملح بعضهما البعض باستمرار.
- سيتلقى جهازي كمبيوتر مختلفين نفس كلمة المرور
- إذا تم تغيير الملح على الخادم من خلال جهاز كمبيوتر واحد ، فلن يعرف الكمبيوتر الآخر الذي يحتوي على الملح القديم أنه بحاجة إلى التغيير
- يمكنك سرقة الملح من جهاز الكمبيوتر الخاص بك واستخدامه لتنفيذ هجوم سريع للغاية على حسابك ، مع العلم أن كلمة المرور بسيطة للغاية.
.. وملعقة عسل:
- . , "cat" , "termorectal" — . , . , . , .
- . `salt_for_password` , , , . .