هل سيكون جيدا تشفير كلمة المرور بـ md5 و sha1 وعكس الناتج وتكرار العملية عدد من المرات ؟

  • ahmad777

قمت ببرمجة سكريبت بسيط لتشفير كلمة المرور باستخدام php

طريقة التشفير هي التالي : (مدخل المستخدم هو test)

  1. اخذ مدخل المستخدم ثم تشفيره بـmd5 فيصبح :

098f6bcd4621d373cade4e832627b4f6

  1. اخذ مدخل المستخدم ثم تشفيره بـsha1 فيصبح :

a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

  1. جمع النص المشفر من md5 و sha1 فيصبح :

098f6bcd4621d373cade4e832627b4f6a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

  1. عكس الناتج فيصبح :

3dbbf289789e193d3780c4c16ab91bcc5ef8a49a6f4b726238e4edac373d1264dcb6f890

  1. تكرار العملية عدد من المرات (4 على سبيل المثال)(ويكون رقم ثابت حتى يسهل فك التشفير)

السؤال هو هل ستكون هذه الطريقة في التشفير مجدية وصعبة ؟


12

يستحسن استعمال المصطلح "هاش - hash" وليس تشفير.

الإجابة هي لا، ليست طريقة جيدة.

العيوب:

  • الطريقة سريعة مع تكرار مثل 4 أو حتى 100، يجب أن تستخدم دالة hash أو hmac على الأقل 10,000 مرة لإبطاء التخمين فعليا.

  • أنت لا تستعمل salt و هو سلسلة عشوائية من البيانات (و يجب أن تولد واحد لكل مستخدم) و هو للوقاية من هجمات القواميس أو ملفات فيها عدد كبير من الهاشات لأشهر كلمات المرور.

  • أنت تستخدم خوارزميات hash غير آمنة و احتمال وجود hash وجود هاش واحد لمدخلين مختلفين كبير خاصة مع md5.

  • تستخدم تقنيات عشوائية لا معنى لها مثل قلب الناتج و لا تضيف شيء في الأمان.

الحلول:

  • استخدم فقط الخوارزمية sha256 و ليس md5 أو sha1.

  • لا تبتكر طريقتك إن لم تبحث كثيرا في موضوع هاشات كلمات المرور.

  • استخدم طريقة موحدة و متفق عليها لعمل hash أو key derivation مثل PBKDF2 فيمكنك أن تختار الخوارزمية التي تريدها أن تعمل فيها وينصح بـ sha256 و فيها كذلك تقدر تدخل عدد التكرارات التي تريدها وتقدر تحدد طول المخرج (ينصح بتحديد 32).


 الخوارزمية PBKDF2 هي طريقة موحدة جاهزة معروفة بـ:

dk = PBKDF2(PRF, Password, Salt, c, dkLen)

حيث dk هو الخرج و الذي هو مثل الهاش و PRF هو مدخل الخوارزمية المرغوب في استخدامها (حدد sha256)، و c هو عدد التكرارات حدد 10,000 و dkLen حدد 32 أي 32 بايت مثل طول خرج sha256. لاحظ أن طول md5 هو 16 بايت، في ويكيبيديا يمكنك أن تجد معلومات مفصلة عن خصائص كل خوارزمية هاش.

اللغة php 5.5.0 وأحدث فيها PBKDF2، إن كان الخادم قديم ابحث في Google عن مكتبات لـ PBKDF2 هي منتشرة.

PBKDF2 تستعمل في البرامج الحساسة ومواقع الويب العالية الجودة والتي تحتاج أمن مثل موقع LastPass

هذا مثال حول الخطوات الأساسية لكن لا تستعمله، استعمل PBKDF2 لأنها موحدة ومختبرة كثيرا

شكرا على المعلومات

شكرا جزيلا لك على المعلومات القيمة


و احتمال وجود hash واحد لمدخلين مختلفين كبير خاصة مع md5.

كنت أفكر في هذا الشيء من قبل


dk = PBKDF2(PRF, Password, Salt, c, dkLen) هنا password هي مدخل المستخدم ؟

وإذا زدنا قيمة سي سيزداد الأمان ؟


إذا أخذت دورة في التشفير هل سأتقن كل هذا ؟

وهل يمكنني تطوير طرقي الخاصة بعد إتقان الدورة ؟

نعم password هي كلمة مرور المستخدم، و salt هي قيمة عشوائية مثل HBRyZ8puaCa تخزنها في قاعدة البيانات . قيمة c كبيرة جدا مثل مليون سيجعل التخمين بطيء، على الويب اجعل الوقت التقريبي المستغرق أن يكون اكبر من 0.01 ثانية و أقل من 0.1 ثانية لتفادي الثقل على الخادم و إلا اجعل حسابه من جهة المستخدم عبر JavaScript لو تريد عدد مثل c=100,000 .

إذا أخذت دورة في التشفير هل سأتقن كل هذا ؟

حسب محتوى الدورة كذلك هناك مقال مميز حول الموضوع

وهل يمكنني تطوير طرقي الخاصة بعد إتقان الدورة ؟

ممكن، لكنك ستقتنع أن PBKDF2 هي حل ممتاز قابل للتخصيص، هذا كود بـ php لتعرف كيف تعمل

%23phpsourcecode