
حفظ كلمات المرور كان دائمًا صداعًا. في الإصدار الكلاسيكي ، لديك مستخدم يحاول جاهداً ألا ينسى "qwerty123" السري بشكل رهيب ونظام المعلومات الذي يخزن التجزئة من كلمة المرور هذه. كما أن النظام الجيد يعمل أيضًا على تجزئة الملح من أجل تسميم حياة الأشخاص السيئين الذين يمكنهم سرقة قاعدة بيانات باستخدام كلمات مرور مجزأة. كل شيء واضح هنا. يتم تخزين بعض كلمات المرور في الرأس ، ويتم تشفير بعضها في keepass.
كل شيء يتغير عندما نزيل من المخطط الشخص الذي يدخل المفتاح بعناية من قطعة من الورق. في تفاعل نظامين للمعلومات ، على أي حال ، يجب تخزين كلمة المرور على جانب العميل في شكل مفتوح للنظام بحيث يمكن إرسالها ومقارنتها مع التجزئة المرجعي. وفي هذه المرحلة ، يفتح المسؤولون عادة الفرع المحلي لمصنع لتصنيع الدراجات ويبدأون في إخفاء المفتاح السري في رمز البرنامج النصي بعناية. العديد من هذه الخيارات ليست عديمة الفائدة فحسب ، ولكنها خطيرة أيضًا. سأحاول تقديم حل مناسب وآمن لهذه المشكلة من أجل بيثون. ولمس قليلا على بوويرشيل.
كيف لا تفعل
الجميع على دراية بمفهوم "البرمجة النصية المؤقتة". هنا ، حرفيًا ، البيانات فقط يمكن تحليلها بسرعة من قاعدة البيانات وحذفها. ثم فجأة اتضح أن البرنامج النصي قد انتقل بالفعل في مكان ما في الإنتاج من منطقة ديف. ثم تبدأ المفاجآت غير السارة من "التصرف" الأولي في الظهور.
الخيار الأكثر شيوعا هو في نمط:
db_login = 'john.doe' password = 'password!'
المشكلة هي أن كلمة المرور هنا تضيء بشكل واضح ويمكن اكتشافها بسهولة بين ودائع النصوص القديمة عن طريق البحث التلقائي. تتبع النسخة الأكثر تعقيدًا بعض الشيء مسار الأمان من خلال الغموض ، مع تخزين كلمة المرور في نموذج مشفر في الكود. في هذه الحالة ، يجب تنفيذ فك التشفير مرة أخرى ، وإلا فلن يتمكن العميل من تقديم كلمة المرور هذه إلى جانب الخادم. ستوفر هذه الطريقة الحد الأقصى من مظهر غير رسمي ، لكن أي تحليل جاد للرمز يدويًا سيسمح لك باستخراج المفتاح السري بسهولة. سيوفر الرمز أدناه فقط من "متصفحي الكتف":
>>> import base64 >>> print base64.b64encode("password") cGFzc3dvcmQ= >>> print base64.b64decode("cGFzc3dvcmQ=") password
السيناريو الأكثر سوءًا هو استخدام أنظمة التحكم في الإصدار ، مثل git ، لمثل هذه الملفات ذات المعلومات الحساسة. حتى إذا قرر المؤلف حذف جميع كلمات المرور ، فسيظل في سجل المستودع. في الواقع ، إذا قمت بتشغيل ملف يحتوي على بيانات سرية في بوابة ، فيمكنك تلقائيًا اعتبارها مخترقة والبدء فورًا في إجراء استبدال جميع بيانات الاعتماد المتأثرة.
باستخدام نظام التخزين
هناك مكتبة
كيرينغ بارد. يعتمد مبدأ التشغيل الأساسي على حقيقة أن كل مستخدم في نظام التشغيل لديه وحدة تخزين مشفرة خاصة به ، ولا يمكن الوصول إليها إلا بعد تسجيل دخول المستخدم إلى النظام. إنه نظام أساسي وسيستخدم الواجهة الخلفية لتخزين كلمات المرور التي يوفرها نظام التشغيل:
- KDE4 و KDE5 KWallet (مطلوب dbus)
- Freedesktop Secret Service - العديد من DEs ، بما في ذلك GNOME (يتطلب secretstorage)
- ويندوز خزانة الاعتماد
- ماك سلسلة المفاتيح
يمكنك أيضًا استخدام
طرق بديلة بديلة أو كتابة معلومات خاصة بك ، إذا كان هناك حاجة إلى شيء غريب تمامًا.
قارن صعوبة الهجوم
عند تخزين كلمة المرور مباشرة في البرنامج النصي ، ستحتاج إلى :
- سرقة الكود نفسه (سهل)
- ديوبفوسيت إذا لزم الأمر (سهل)
عند استخدام سلسلة مفاتيح محلية ، يحتاج المهاجم إلى:- سرقة الكود نفسه (سهل)
- ديوبفوسيت إذا لزم الأمر (سهل)
- لتسوية الجهاز المحلي عن طريق تسجيل الدخول كمستخدم المهاجم (الصعب)
من الناحية النظرية ، يمكن الحصول على الوصول إلى التخزين المحلي بواسطة أي برنامج محلي يعمل نيابة عن المستخدم الحالي ، إذا كان يعرف إعدادات الوصول لكلمة المرور السرية. ومع ذلك ، هذه ليست مشكلة ، لأنه في حالة وجود حساب مخترق ، سيتمكن المهاجم من اعتراض جميع البيانات الحساسة. لن يتمكن المستخدمون الآخرون والبرامج الخاصة بهم من الوصول إلى لوحة المفاتيح المحلية.
مثال للاستخدام
import argparse import getpass import keyring def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument("-n", "--newpass", required=False, help="Set new password", action="store_true") arguments = parser.parse_args() return arguments def fake_db_connection():
كلمة السر الأمن
تسرب كلمة مرور سرية شائعة أخرى هو محفوظات سطر الأوامر. استخدام الإدخال القياسي غير مسموح به هنا:
age = input("What is your age? ") print "Your age is: ", age type(age) >>output What is your age? 100 Your age is: 100 type 'int'>
في المثال أعلاه ، ذكرت بالفعل مكتبة
getpass :
يشبه إدخال البيانات عند استخدامها الطريقة الكلاسيكية * عند تسجيل الدخول. لا تتم كتابة البيانات أو عرضها على أي شاشة في أي سجلات نظام.
قليلا عن بوويرشيل
بالنسبة إلى Powershell ، الخيار الصحيح هو استخدام Windows Credential Locker القياسي.
يتم تطبيق هذا بواسطة وحدة
CredentialManager .
مثال للاستخدام:
Install-Module CredentialManager -force New-StoredCredential -Target $url -Username $ENV:Username -Pass .... Get-StoredCredential -Target ....