بيثون سرداب الوحدة — ما هو الاستخدام الصحيح الأملاح?

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

سؤال

أولا السياق:أحاول إنشاء سطر الأوامر أداة تعتمد على (لينكس) أن يتطلب تسجيل الدخول.حسابات على هذه الأداة لا علاقة لها على مستوى النظام الحسابات-لا شيء من هذا يبدو في /etc/passwd.

أنا تخطط لتخزين حسابات المستخدمين في ملف نصي باستخدام نفس الشكل (تقريبا) مثل /etc/passwd.

على الرغم من عدم استخدام هذا النظام على مستوى كلمة السر الملفات باستخدام سرداب بدا أن تكون ممارسة جيدة لاستخدام بدلا من تخزين كلمات المرور في نص واضح.(في حين crypt هو بالتأكيد أفضل من تخزين كلمات المرور في نص واضح, أنا مستعد طرق أخرى للقيام بذلك.)

سردابي المعرفة وبناء على هذا:https://docs.python.org/2/library/crypt.html

الوثائق يبدو أن نسأل عن شيء لم يكن هذا ممكنا:"إنه من المستحسن استخدام كامل crypted كلمة المرور الملح عند التحقق بكلمة مرور."

؟ إذا أنا خلق crypted كلمة المرور (كما عند إنشاء المستخدم سجل) كيف يمكنني استخدام crypted مرور بمثابة الملح ؟ ذلك لا وجود لها حتى الآن.(أنا أفترض أنه يجب استخدام نفس الملح لخلق التحقق من كلمة المرور.)

لقد حاولت استخدام كلمة السر الغير مشفرة مثل الملح.هذا لا العمل, ولكن اثنين من المشاكل ؛ أحد التغلب عليها بسهولة ، واحدة خطيرة:

1) أول حرفين من كلمة السر الغير مشفرة مدرجة في crypted كلمة المرور.يمكنك إصلاح هذا قبل لا أكتب الأولين شخصيات الملف:

user_record = '%s:%s:%s' % (user_name, crypted_pw[2:], user_type)

2) باستخدام كلمة السر الغير مشفرة مثل الملح ، يبدو أن تقليل كمية من الكون في النظام.ربما أنا سوء فهم الغرض من الملح.

أفضل الممارسات لقد كنت قادرا على استخلاص هو استخدام الأولين أحرف من اسم المستخدم الملح.هذا من شأنه أن يكون مناسبا ، أو هل هناك شيء فاتني أن يجعل هذا التحرك ؟

أفهم من الملح أن يمنع ما قبل الحوسبة المرور التجزئة من القاموس.يمكنني استخدام معيار الملح للجميع كلمات السر (مثل حروف اسمي, "JS,") ولكن يبدو أن أقل من العبء عن مهاجم من استخدام حرفين من كل مستخدم اسم المستخدم.

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

المحلول

لاستخدام وحدة سرداب:

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

وتعليقات عامة:

إذا هذا له علاقة ث / تسجيلات النظام الفعلي لا شيء، لا شيء يمنعك من استخدام وسيلة أقوى من سرداب. هل يمكن أن تولد عشوائيا الأحرف N من الملح لكل مستخدم، لتكون جنبا إلى جنب مع كلمة المرور الخاصة بالمستخدم في تجزئة SHA-1.

string_to_hash = user.stored_salt + entered_password
successful_login = (sha1(string_to_hash) == user.stored_password_hash)

وUPDATE: في حين أن هذا أبعد ما يكون أكثر أمنا ضد الجداول قوس قزح، وطريقة أعلاه لا يزال لديه نقاط ضعف التشفير. التطبيق الصحيح لخوارزمية HMAC يمكن بعد مزيد من زيادة الأمان، ولكن هو أبعد من بلدي مجال الخبرة.

نصائح أخرى

وسرداب بايثون () هو مجمع من أجل وظيفة () سرداب النظام. من الصفحة رجل لينكس سرداب ():

char *crypt(const char *key, const char *salt);

key is a user’s typed password.
salt is a two-character string chosen from the set [a–zA–Z0–9./]. 
This string is used to perturb the algorithm in one of 4096 
different ways.

والتركيز على " المكون من حرفين السلسلة". الآن، إذا نظرتم الى سرداب () الصورة السلوك في بيثون:

>>> crypt.crypt("Hello", "World")
'Wo5pEi/H5/mxU'
>>> crypt.crypt("Hello", "ABCDE")
'AB/uOsC7P93EI'

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

ملحوظة: مجموعة [a-zA-Z0-9./] يحتوي على 64 حرفا، و 64 * 64 = 4096. وهنا كيف <م> اثنين الأحرف تتعلق " 4096 طرق مختلفة".

أنت سوء فهم وثائق. تقول أنه منذ مدة الملح قد تختلف تبعا لتنفيذ سرداب الأساسي ()، يجب تقديم كلمة المرور crypted كامل كقيمة الملح <م> عندما كلمات السر التحقق . وهذا هو، بدلا من سحب حرف الأولين من أن يكون الملح، فقط إرم في كل شيء.

وأن يستند لديك فكرة وجود الملح في البداية على اسم المستخدم يبدو بخير.

وهنا بعض النصائح العامة حول التمليح كلمات السر:

  1. في عام الأملاح المستخدمة ranbow الجداول مكلفة جدا لحساب.لذا ينبغي عليك إضافة القليل من العشوائية الملح إلى تجزئات كلمة المرور و تخزينه في نص عادي بجانب كلمة المرور المجزأة القيمة.
  2. استخدام HMAC إنه مستوى جيد, و هو أكثر أمانا من وصل كلمة المرور و الملح.
  3. استخدام SHA1:MD5 مكسورة.أي جريمة المقصود إذا عرفت هذا ، فقط كوني شامل.;)

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

لبعض قوة إضافية، يمكنك الحصول على وحدة سرداب لاستخدام MD5 باستخدام الملح في الشكل.

$1$ABCDEFGH$

وحيث ABCDEFGH هو سلسلة الملح.

>>> p = crypt.crypt('password', '$1$s8Ty3/f$')
>>> p
Out: '$1$s8Ty3/f$0H/M0JswK9pl3X/e.n55G1'
>>> p == crypt.crypt('password', p)
Out: True

و(لاحظ أن هذا هو امتداد جنو إلى سرداب، انظر "سرداب رجل" على نظام لينكس). MD5 (وحتى الآن SHA1) قد تكون "كسر"، لكنها لا تزال جيدة نسبيا للتجزئات كلمة السر، وMD5 لا يزال معيارا لكلمات السر المحلية لينكس.

وكلمة المرور، أو أي شيء مشتق من كلمة المرور، لا ينبغي أبدا أن تستخدم الملح. يجب أن يكون الملح بكلمة مرور خاصة لا يمكن التنبؤ بها.

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

استخدم PBKDF2، انظر هذا التعليق على موضوع مختلف ( يشمل تنفيذ بيثون).

نلقي نظرة على هذه المادة وأوضح تروكربت قبل بيورن Edström.أنه يحتوي على السهل أن نفهم شرح كيف تروكربت يعمل الثعبان بسيط تنفيذ بعض تروكربت وظائف بما في ذلك إدارة كلمة المرور.

إنه يتحدث عن الثعبان crypt() وحدة ، لا حول تروكربت في بايثون

الافتراضي crypt.crypt() في بيثون 2 ليست آمنة جدا ، المادة يشرح كيف بدائل أكثر أمنا قد عمل.

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