سؤال

يأتي إطار عمل .NET مزودًا بـ 6 خوارزميات تجزئة مختلفة:

  • MD5:16 بايت (الوقت اللازم لتجزئة 500 ميجابايت:1462 مللي ثانية)
  • شا-1:20 بايت (1644 مللي ثانية)
  • SHA256:32 بايت (5618 مللي ثانية)
  • شا384:48 بايت (3839 مللي ثانية)
  • SHA512:64 بايت (3820 مللي ثانية)
  • ريبيمد:20 بايت (7066 مللي ثانية)

تؤدي كل وظيفة من هذه الوظائف بشكل مختلف؛MD5 هو الأسرع و RIPEMD هو الأبطأ.

يتمتع MD5 بميزة ملاءمته لنوع الدليل المدمج؛ وهو أساس النوع 3 UUID. تجزئة SHA-1 هي أساس النوع 5 UUID. مما يجعلها سهلة الاستخدام لتحديد الهوية.

ومع ذلك، فإن MD5 عرضة لـ هجمات الاصطدام, ، SHA-1 ضعيف أيضًا ولكن بدرجة أقل.

تحت أي ظروف يجب أن أستخدم خوارزمية التجزئة؟

الأسئلة المحددة التي أشعر بالفضول حقًا لرؤية الإجابة عليها هي:

  • هل لا يمكن الوثوق بـ MD5؟في المواقف العادية عندما تستخدم خوارزمية MD5 بدون نية خبيثة ولا يوجد طرف ثالث لديه أي نية خبيثة، هل تتوقع أي تصادمات (بمعنى بايتين تعسفيين [] ينتجان نفس التجزئة)

  • ما هو أفضل بكثير من RIPEMD من SHA1؟(إذا كان أفضل) فهو أبطأ بخمس مرات في الحساب ولكن حجم التجزئة هو نفس حجم SHA1.

  • ما هي احتمالات حدوث تصادمات غير ضارة عند تجزئة أسماء الملفات (أو سلاسل قصيرة أخرى)؟(على سبيل المثال.اسما ملفان عشوائيان بنفس تجزئة MD5) (مع MD5 / SHA1 / SHA2xx) بشكل عام، ما هي احتمالات الاصطدامات غير الضارة؟

هذا هو المعيار الذي استخدمته:

    static void TimeAction(string description, int iterations, Action func) {
        var watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < iterations; i++) {
            func();
        }
        watch.Stop();
        Console.Write(description);
        Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
    }

    static byte[] GetRandomBytes(int count) {
        var bytes = new byte[count];
        (new Random()).NextBytes(bytes);
        return bytes;
    }


    static void Main(string[] args) {

        var md5 = new MD5CryptoServiceProvider();
        var sha1 = new SHA1CryptoServiceProvider();
        var sha256 = new SHA256CryptoServiceProvider();
        var sha384 = new SHA384CryptoServiceProvider();
        var sha512 = new SHA512CryptoServiceProvider();
        var ripemd160 = new RIPEMD160Managed();

        var source = GetRandomBytes(1000 * 1024);

        var algorithms = new Dictionary<string,HashAlgorithm>();
        algorithms["md5"] = md5;
        algorithms["sha1"] = sha1;
        algorithms["sha256"] = sha256;
        algorithms["sha384"] = sha384;
        algorithms["sha512"] = sha512;
        algorithms["ripemd160"] = ripemd160;

        foreach (var pair in algorithms) {
            Console.WriteLine("Hash Length for {0} is {1}", 
                pair.Key, 
                pair.Value.ComputeHash(source).Length);
        }

        foreach (var pair in algorithms) {
            TimeAction(pair.Key + " calculation", 500, () =>
            {
                pair.Value.ComputeHash(source);
            });
        }

        Console.ReadKey();
    }
هل كانت مفيدة؟

المحلول

في التشفير، توفر وظائف التجزئة ثلاث وظائف منفصلة.

  1. مقاومة الاصطدام:ما مدى صعوبة العثور على رسالتين (أي رسالتين) التي تجزئة نفس الشيء.
  2. مقاومة ما قبل الصورة:في حالة وجود تجزئة، ما مدى صعوبة العثور على رسالة أخرى لها نفس التجزئة؟يُعرف أيضًا باسم أ وظيفة التجزئة في اتجاه واحد.
  3. المقاومة الأولية للصورة الثانية:عند ظهور رسالة، ابحث عن رسالة أخرى لها نفس التجزئة.

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

لقد ثبت أن MD5 ليس مقاومًا للتصادم، لكن هذا لا يمنع استخدامه في التطبيقات التي لا تتطلب مقاومة للتصادم.في الواقع، لا يزال MD5 يُستخدم غالبًا في التطبيقات التي يكون فيها حجم المفتاح الأصغر وسرعته مفيدًا.ومع ذلك، نظرًا لعيوبها، يوصي الباحثون باستخدام وظائف التجزئة الأخرى في سيناريوهات جديدة.

يحتوي SHA1 على خلل يسمح بالعثور على التصادمات نظريًا في أقل بكثير من الخطوات 2^80 التي تتطلبها دالة التجزئة الآمنة بطولها.تتم مراجعة الهجوم باستمرار ويمكن تنفيذه حاليًا في خطوات ~ 2 ^ 63 - بالكاد ضمن المجال الحالي للحوسبة.لهذا السبب، تقوم NIST بالتخلص التدريجي من استخدام SHA1، مشيرة إلى أنه يجب استخدام عائلة SHA2 بعد عام 2010.

SHA2 هي عائلة جديدة من وظائف التجزئة التي تم إنشاؤها بعد SHA1.لا توجد حاليًا أي هجمات معروفة ضد وظائف SHA2.SHA256 و384 و512 كلها جزء من عائلة SHA2، فقط باستخدام أطوال مفاتيح مختلفة.

RIPEMD لا يمكنني التعليق كثيرًا عليها، باستثناء الإشارة إلى أنها ليست شائعة الاستخدام مثل عائلات SHA، وبالتالي لم يتم فحصها عن كثب من قبل باحثي التشفير.لهذا السبب وحده أوصي باستخدام وظائف SHA عليها.في التنفيذ الذي تستخدمه، يبدو الأمر بطيئًا جدًا أيضًا، مما يجعله أقل فائدة.

في الختام، لا توجد وظيفة واحدة أفضل - كل هذا يتوقف على ما تحتاجه من أجله.كن على دراية بالعيوب الموجودة في كل منها وستكون قادرًا على اختيار وظيفة التجزئة المناسبة لها لك سيناريو.

نصائح أخرى

جميع وظائف التجزئة "مكسورة"

ال مبدأ الحمامة يقول أنه حاول بأقصى ما تستطيع، فلن تتمكن من وضع أكثر من حمامتين في فتحتين (إلا إذا قمت بتقطيع الحمام).وبالمثل، لا يمكنك احتواء أرقام 2^128 + 1 في فتحات 2^128.تؤدي جميع وظائف التجزئة إلى تجزئة ذات حجم محدود، وهذا يعني أنه يمكنك دائمًا العثور على تصادم إذا بحثت من خلال تسلسلات "الحجم المحدود" + 1.ليس من الممكن القيام بذلك.ليس لـ MD5 وليس لـ خصلة شعر.

ليس لدى MD5/SHA1/Sha2xx فرصة للاصطدامات

جميع وظائف التجزئة لها تصادمات، إنها حقيقة من حقائق الحياة.إن مواجهة هذه الاصطدامات عن طريق الصدفة يعادل الفوز في اليانصيب بين المجرات.ذلك بالقول، لا أحد يفوز في اليانصيب بين المجرات, ، هذه ليست الطريقة التي يعمل بها اليانصيب.لن تصادف تجزئة MD5/SHA1/SHA2XXX غير المقصودة على الإطلاق.كل كلمة في كل قاموس، في كل لغة، يتم تصنيفها إلى قيمة مختلفة.يحتوي كل اسم مسار، على كل جهاز في الكوكب بأكمله، على تجزئة MD5/SHA1/SHA2XXX مختلفة.كيف أعرف ذلك، قد تسأل.حسنًا، كما قلت من قبل، لا أحد يفوز باليانصيب بين المجرات على الإطلاق.

لكن ...MD5 مكسور

في بعض الأحيان لا يهم حقيقة أنه مكسور.

كما هو الحال لا توجد معروفة هجمات ما قبل الصورة أو هجمات ما قبل الصورة الثانية على إم دي 5.

ربما تتساءل ما الذي يعطل MD5؟من الممكن أن يقوم طرف ثالث بإنشاء رسالتين، إحداهما شريرة والأخرى جيدة وكلاهما مجزأتان بنفس القيمة.(هجوم الاصطدام)

ومع ذلك، توصية RSA الحالية بعدم استخدام MD5 إذا كنت بحاجة إلى مقاومة ما قبل الصورة.يميل الناس إلى توخي الحذر عندما يتعلق الأمر بخوارزميات الأمان.

إذن ما هي وظيفة التجزئة التي يجب أن أستخدمها في .NET؟

  • استخدم MD5 إذا كنت بحاجة إلى السرعة/الحجم ولا تهتم بهجمات أعياد الميلاد أو هجمات ما قبل الصورة.

كرر هذا بعدي، لا توجد فرصة لاصطدامات MD5, ، يمكن تصميم الاصطدامات الخبيثة بعناية.على الرغم من عدم وجود هجمات ما قبل الصورة المعروفة حتى الآن على MD5، إلا أن الخبراء الأمنيين يقولون إنه لا ينبغي استخدام MD5 حيث تحتاج إلى الدفاع ضد هجمات ما قبل الصورة. الشيء نفسه ينطبق على SHA1.

ضع في اعتبارك أنه لا تحتاج جميع الخوارزميات إلى الحماية ضد هجمات ما قبل الصورة أو هجمات الاصطدام.خذ الحالة التافهة المتمثلة في البحث الأول عن الملفات المكررة على القرص الصلب الخاص بك.

  • استخدم الوظيفة المستندة إلى SHA2XX إذا كنت تريد وظيفة تجزئة آمنة للتشفير.

لم يعثر أحد على أي تصادم SHA512.أبدًا.لقد حاولوا جاهدين حقا.ولهذا السبب، لم يعثر أحد على أي تصادم SHA256 أو 384 على الإطلاق..

  • لا تستخدم SHA1 أو RIPEMD إلا إذا كان ذلك لسيناريو التشغيل التفاعلي.

لم تتلق RIPMED نفس القدر من التدقيق الذي تلقاه SHAX وMD5.كل من SHA1 وRIPEMD معرضان لهجمات أعياد الميلاد.كلاهما أبطأ من MD5 على .NET ويأتي بحجم 20 بايت.من غير المجدي استخدام هذه الوظائف، ونسيانها.

انخفضت هجمات تصادم SHA1 إلى 2^52، ولن يمر وقت طويل حتى تظهر تصادمات SHA1 في البرية.

للحصول على معلومات محدثة حول وظائف التجزئة المختلفة، قم بإلقاء نظرة على حديقة الحيوان وظيفة التجزئة.

لكن انتظر، هناك المزيد

املك سريع وظيفة التجزئة يمكن أن تكون لعنة.على سبيل المثال:الاستخدام الشائع جدًا لوظائف التجزئة هو تخزين كلمة المرور.بشكل أساسي، تقوم بحساب تجزئة كلمة المرور المدمجة مع سلسلة عشوائية معروفة (لعرقلة هجمات قوس قزح) وتخزين تلك التجزئة في قاعدة البيانات.

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

للتغلب على هذه المشكلة، com.bcrypt يمكن استخدام الخوارزمية، وهي مصممة لتكون بطيئة بحيث يتباطأ المهاجم بشدة إذا هاجم نظامًا يستخدم bcrypt.حديثاً scrypt لقد تصدرت بعض العناوين الرئيسية ويعتبرها البعض أكثر فعالية من bcrypt ولكني لا أعرف عن تطبيق .Net.

تحديث:

لقد تغير الزمن، لدينا فائز SHA3.أوصي باستخدام keccak (الملقب ب SHA3) الفائز في مسابقة SHA3.

الجواب الأصلي:

وبالترتيب من الأضعف إلى الأقوى أقول:

  1. RIPEMD BROKEN، لا ينبغي استخدامه أبدًا كما يمكن أن يرى في هذا قوات الدفاع الشعبي
  2. MD-5 مكسور، لا ينبغي استخدامه مطلقًا، يمكن كسرها في دقيقتين باستخدام جهاز كمبيوتر محمول
  3. SHA-1 مكسور، لا ينبغي استخدامه مطلقًا، تم كسره من حيث المبدأ، والهجمات تتحسن كل أسبوع
  4. SHA-2 WEAK، من المحتمل أن يتم كسره في السنوات القليلة المقبلة. تم العثور على بعض نقاط الضعف. لاحظ أنه بشكل عام، كلما زاد حجم المفتاح، زادت صعوبة كسر وظيفة التجزئة.على الرغم من أن حجم المفتاح = القوة ليس صحيحًا دائمًا، إلا أنه صحيح في الغالب.لذا ربما يكون SHA-256 أضعف من SHA-512.
  5. لا توجد نقاط ضعف معروفة، مرشح لـ SHA-3.إنها جديدة إلى حد ما وبالتالي لم يتم اختبارها. وقد تم تنفيذه في مجموعة من اللغات.
  6. MD6 لا توجد نقاط ضعف معروفة، وهو مرشح آخر لـ SHA-3.من المحتمل أنه أقوى من Skien، ولكنه أبطأ في الأجهزة ذات النواة الواحدة.مثل سكاين لم يتم اختباره.يستخدمه بعض المطورين ذوي التفكير الأمني أدوار المهمة الحاسمة.

أنا شخصياً سأستخدم MD6، لأنه لا يمكن للمرء أن يصاب بجنون العظمة أبدًا.إذا كانت السرعة مصدر قلق حقيقي فسأنظر إلى Skein أو SHA-256.

دفاعًا عن MD5، لا توجد طريقة معروفة لإنتاج ملف يحتوي على تجزئة MD5 عشوائية.يجب على المؤلف الأصلي أن يخطط مسبقًا لحدوث تصادم ناجح.وبالتالي، إذا كان المتلقي يثق بالمرسل، فإن MD5 جيد.يتم تعطيل MD5 إذا كان المُوقع ضارًا، ولكن من غير المعروف أنه عرضة لهجمات الوسيط.

يعتمد الخيار الذي تستخدمه حقًا على الغرض الذي تستخدمه من أجله.إذا كنت تريد فقط التأكد من عدم تلف الملفات أثناء النقل ولست مهتمًا بالأمان، فاختر السرعة والصغيرة.إذا كنت بحاجة إلى توقيعات رقمية لاتفاقيات إنقاذ فيدرالية بمليارات الدولارات وتحتاج إلى التأكد من عدم تزويرها، فاختر التوقيع الصعب والتحايل والبطء.

أود أن أشير (قبل أن يتم تمزيق md5) إلى أنني ما زلت أستخدم md5 على نطاق واسع على الرغم من تعطله الشديد بالنسبة للكثير من العملات المشفرة.

طالما أنك لا تهتم بالحماية من الاصطدامات (لا يزال بإمكانك استخدام md5 في hmac أيضًا بأمان) وتريد السرعة (أحيانًا تريد تجزئة أبطأ)، فلا يزال بإمكانك استخدام md5 بثقة.

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

كما هو موصوف، فهو أسرع من MD5 وعلى الأقل آمن مثل SHA-3.ويتم تنفيذه أيضًا بواسطة العديد من التطبيقات البرمجية, بما في ذلك برنامج WinRar.

أنا لست خبيرًا في هذا النوع من الأشياء، لكنني أتابع مجتمع الأمان ويعتبر الكثير من الأشخاص هناك أن تجزئة md5 معطلة.أود أن أقول إن أي واحد يجب استخدامه يعتمد على مدى حساسية البيانات والتطبيق المحدد.قد تتمكن من الإفلات بتجزئة أقل أمانًا قليلًا طالما أن المفتاح جيد وقوي.

وهذه اقتراحاتي لك:

  1. ربما ينبغي عليك أن تنسى MD5 إذا كنت تتوقع حدوث هجمات.هناك العديد من طاولات قوس قزح بالنسبة لهم عبر الإنترنت، ومن المعروف أن شركات مثل RIAA قادرة على إنتاج تسلسلات ذات تجزئات مكافئة.
  2. إستخدم ملح إذا استطعت.قد يؤدي تضمين طول الرسالة في الرسالة إلى صعوبة إجراء تصادم تجزئة مفيد.
  3. كقاعدة عامة، المزيد من البتات يعني تصادمات أقل (حسب مبدأ التصنيف) وأبطأ، وربما أكثر أمانًا (إلا إذا كنت عبقري الرياضيات الذي يمكنه العثور على نقاط الضعف).

انظر هنا للحصول على ورقة توضح بالتفصيل خوارزمية لإنشاء تصادمات md5 في 31 ثانية باستخدام كمبيوتر مكتبي Intel P4.

http://eprint.iacr.org/2006/105

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