سؤال

تعثرت عبر bcrypt.net بعد القراءة مشاركة Jeff Atwood حول تخزين كلمات المرور مما دفعني إلى توصية توماس بتواسيك ل استخدام bcrypt. لتخزين كلمات المرور. الذي قادني أخيرا إلى هذا C # تنفيذ bcrypt

في التعليقات على الرابط الأخير أعلاه، سأل شخص ما "لماذا يستغرق الأمر (30) إلى الأبد، ولكن يبدو أن (31) لا يستغرق وقتا طويلا؟"

ركضت bcrypt.hashpassword (كلمة المرور، bcrypt.generatesalt (31)) وحصلت على نتيجة 0 مللي ثانية.

لقد قمت بتشغيل bcrypt.hashpassword ("كلمة المرور"، bcrypt.generatesalt (30)) لأكثر من 5 دقائق الآن ولا تملك نتيجة لذلك.

أدرك أننا لن نحتاج إلى الملح المكون من 30 حرفا تم إنشاؤه بشكل عشوائي لإنشاء تجزئة كلمة المرور الخاصة بنا (أو تشفير لا رجعة فيه في حالة BCREPT) لسنوات. تعديل يجب أن أقرأ الكود قليلا، لا يحتوي Logonss على أي شيء يتعلق بطول الملح. شكرا aaronaugh.

لذلك، لماذا تقوم (31) بإرجاع قيمة على الفور تقريبا (عندما يجب أن يستغرق حوالي ضعف ما يبلغ طوله (30)؟

تحديث

هنا هو الإصلاح:

private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
    // ... snip ...
    uint rounds = 1U << logRounds;
    // ... snip
}
هل كانت مفيدة؟

المحلول

أظن أن الخطأ هنا:

private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
    // ... snip ...
    int rounds = 1 << logRounds;
    // ... snip
}

عند تحديد 31 ل logRounds, ، يحسب أنه as 2 ^ 32، والتي لا يمكن أن تتناسب مع int ويتفقان، لذلك يتم بالفعل التجزئة في ... إيه، صفر يمر. يجب أن يستخدم المؤلف uint في حين أن. من السهل إصلاح!


أراد أيضا التعليق على هذا:

أدرك أننا لن نحتاج إلى الملح الذي تم إنشاؤه عشوائيا لمدة 30 حرفا لإنشاء كلمة المرور الخاصة بنا ...

نلاحظ أن logRounds لا تشير المعلمة إلى عدد الأحرف / البايتات في الملح، والذي هو دائما 16. وهو يشير إلى قاعدة لوغاريتمي لعدد التمريرات التي سيتطلبها التجزئة للحساب؛ بمعنى آخر، إنها وسيلة لجعل مقياس Bcrypt مع قانون مور، مما يجعل الوظيفة عدة أوامر من الحجم أكثر تكلفة لحساب ما إذا كانت أجهزة الكمبيوتر بسرعة ما يكفي لقضاء التجزئة الموجودة.

نصائح أخرى

إذا التجزئة مع GenerateSalt(31) إرجاع على الفور تقريبا، هذا خطأ. يجب عليك الإبلاغ عن أن المنبع (لدي، ل JBCREPT). :-)

بشكل افتراضي، تكون جولات السجل 10. هذا يعني أن (إذا كنت أتذكر بشكل صحيح)، يتم استخدام 1024 جولة. في كل مرة تزداد فيها جولات السجل، تضاعف عدد الجولات.

عند 30 جولة سجل، كنت تفعل جولات 1073741824. هذا بحق يستغرق وقتا طويلا. عند 31 جولة تسجيل الدخول، يجب إجراء 2147483648 جولات، لكنني أظن أن التنفيذ الخاص الذي تستخدمه في الفيضان بدلا من ذلك. :-(

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