لماذا يستخدم البعض خوارزميات تشفير مخصصة ؟

  • axok12

السلام عليكم ، أثناء فحصي لجهاز التوجيه Router من إصدار شركة Huawei بهدف بعض عمليات الأتمتة ، اكتشفت أنك عندما تحاول تسجيل الدخول تقوم الصفحة بإرسال Request للـ Mini web server المدمج في الراوتر ، ويحتوي على بعض البيانات منها CSRF token و CSRF parameter واسم المستخدم ، وكلمة المرور لكن مشفرة ...

عندما بحثت عن الدالة المسئولة عن تشفير كلمة المرور وجدتها في ملف Javascript وبطبيعة الحال هذا الملف متاح للمستخدم بمجرد فتح صفحة الويب ، تلك هي طريقة التشفير:

var plaintPwd = this.content.get("UserName") + base64Encode(SHA256(this.content.get("Password"))) + csrf_obj.csrf_param + csrf_obj.csrf_token;
post_data["data"]["Password"] = SHA256(plaintPwd);

هذه هي الدوال المصممة خصيصا للتشفير ->

كما تلاحظون ، يتم التشفير على أربع مراحل:

1- يتم تشفير كلمة المرور باستخدام دالة SHA256

2- يتم تشفير الناتج السابق عن طريق دالة base64Encode

3 - يتم إضافة اسم المستخدم (غالبا admin) مع الناتج السابق وإضافة ناتج الدمج إلى اثنين من CSRF tokens يتم توليدهم بشكل عشوائي بمجرد تحميل الصفحة.

4- يتم تشفير الناتج السابق بواسطة SHA256 مرة أخرى

السؤال هو ، لماذا كل هذا الصداع ، ألم يكن من الممكن استخدام خوارزميات جاهزة ومعروفة مثل SHA256 مثلا واستخدامها مع كلمة المرور فقط (أعتقد جافا سكربت مليئة بالمكتبات المختصة بالتشفير) ؟؟

أنا لم أستطع قراءة الدوال جيدا ، لكن أليس استخدام تلك الطريقة يعد Over Engineering ؟

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

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

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

تطبيق base64 بعد sha هو ممارسة شائعة لأن الناتج من SHA256 هو raw bytes وعند تطبيق base64 encoding تتحول ال ascii

وبالبنسبة لنقطة جمع اسم المستخدم وcsrf + ناتج ال base64

فمما ذكرت فان CSRF يتم توليدها عشوائيا ومع معلومة أن من خصائص ال Hashing أن يكون نفس ل input نفس ال output دائما وهو ما لا يتحقق إذا كان CSRF عشوائي

إذا يمكننا إستتناج أن الهدف ليس هو عمل Hashing دائم لكلمة المرور بل عمل hashing ثابت فقط طوال مدة الجلسة session ويتغير من جلسة لاخرى

وهذا يسمي PseudoRandom Function (PRF ) ويختلف عن PseudoRandom Generator (PRNG )

في انه يعتمد على

 *  Random Seed والتي تمثلها CSRF  العشوائية
 * Fixed Input والتي يمثلها اسم المستخدم وكلمة المرور

بدون استخدام PRF واستخدام SHA فقط فالناتج دائما ثابت وهو ما يمثل خطورة

لأن الناتج من SHA256 هو raw bytes

في الواقع الناتج النهائي تم تشفيره مرة أخرى في الخطوة الأخيرة بواسطة دالة SHA256 والناتج نص وليس raw bytes ، وذلك النص يتم إرساله مع باقي البيانات داخل json في POST request إلى المخدم، أنا قمت بتحويل دوال التشفير إلى لغة بايثون بواسطة js2py ، واستطعت الحصول على نفس الناتج الذي يتم توليده في المتصفح ، وقمت بإكمال البرنامج ونجحت في تسجيل الدخول بواسطة requests مباشرة دون فتح متصفح.

أشكرك على شرح الفارق بين PRF و PRNG ، لكن هناك شيء آخر وهو عنوان الموضوع ، لماذا قاموا بابتكار base64Encode و SHA256 ؟

أعني هل توجد مشكلة من استخدام jQuery plugin جاهزة تقوم بتلك العملية ؟ المطورين بالفعل يستخدمون مكتبة jQuery

<script type="text/javascript" language="javascript" src="/lib/cat_jquery.js.jgz"></script>

في الواقع الناتج النهائي تم تشفيره مرة أخرى في الخطوة الأخيرة بواسطة دالة SHA256 والناتج نص وليس raw bytes ،

ناتج SHA256 هو raw bytes وليس نص ما تراه على الشاشة يسمي Hex format/encoding حتي تستطيع رؤيته

لا أعلم لماذا قاموا بكتابة كود التشفير بأنفسهم بدلا من استخدام مكتبة