php unlock - ما هو md5()؟




encryption decrypt (12)

كنت أقرأ هذا البرنامج التعليمي لنظام بسيط لتسجيل الدخول إلى PHP .

في النهاية ، يجب عليك تشفير كلمة المرور الخاصة بك باستخدام md5 () .

على الرغم من أنني أعلم أن هذا هو برنامج تعليمي للمبتدئين ، وأنك لا يجب أن تضع بيانات البنك وراء نظام تسجيل الدخول هذا ، فإن هذا جعلني أفكر في التشفير.

ذهبت إلى الأمام وذهبت إلى (واحدة من أكثر الأسئلة فائدة في هذا الموقع بالنسبة للمبتدئين): ما الذي يجب أن يعرفه المطور قبل إنشاء موقع عام؟

هناك تقول (تحت الأمن) يجب عليك:

تشفير كلمات مرور التجزئة والملح بدلاً من تخزينها نص عادي.

لا يقول الكثير عن ذلك ، لا مراجع.

لذلك ذهبت إلى الأمام وحاولت ذلك بنفسي:

$pass = "Trufa";
$enc = md5($pass);

echo $enc; #will echo 06cb51ce0a9893ec1d2dce07ba5ba710

وهذا ما جعلني أفكر ، أنه على الرغم من أنني أعلم أن md5 () قد لا يكون أقوى طريقة للتشفير ، فإن أي شيء دائمًا ينتج نفس النتيجة يمكن إجراء هندسة عكسية له.

فما هو معنى تشفير شيء مع md5 () أو أي طريقة أخرى؟

إذا حصل أحد المتسللين على كلمة مرور مشفرة باستخدام md5 () ، فسيستخدم هذه الصفحة فقط! .

حتى الآن الأسئلة الفعلية:

  1. كيف يعمل تشفير كلمة المرور؟

أعلم أنني لم أكتشف نقطة ضعف كبيرة على الويب هنا! :) أنا فقط أريد أن أفهم المنطق وراء تشفير كلمة المرور.

أنا متأكد من أنني أفهم شيئًا خاطئًا ، وسأكون ممتنًا إذا كنت تستطيع مساعدتي في تعيين رأيي والآخر (على أمل).

كيف سيكون عليك تطبيق تشفير كلمة المرور حتى تكون مفيدة بالفعل؟

  1. ماذا عن هذه الفكرة؟

كما قلت ، قد أحصل على الفكرة كلها بشكل خاطئ ، لكن هل ستضيف هذه الطريقة أي أمن في بيئة حقيقية؟

$reenc = array(
 "h38an",
 "n28nu",
 "fw08d"
 );

$pass = "Trufa";

$enc = chunk_split(md5($pass),5,$reenc[mt_rand(0,count($reenc)-1)]);

echo $enc;

كما ترى ، أضفت عشوائياً سلاسل عشوائية ( $reenc = array() ) إلى كلمة المرور الخاصة بي md5 () "مما يجعلها فريدة". هذا بالطبع هو مجرد مثال سخيف.

قد أكون مخطئا ، ولكن ما لم "نستخرج التشفير بنفسك" فسوف يكون من السهل عكسه.

ما سبق هو فكرتي عن "حماية كلمة المرور" وكلمة المرور المشفرة ، إذا وصل إليها أحد المتسللين لن يتمكن من فك تشفيرها ما لم يتمكن من الوصول إلى الخام .php

أعلم أن هذا قد لا يكون منطقيًا ، لكن لا يمكنني معرفة سبب هذه الفكرة السيئة!

آمل أن أكون قد أوضحت نفسي بشكل كافٍ ، لكن هذا سؤال طويل جدًا ، لذا يرجى طلب أي توضيح مطلوب!

شكرا مقدما!!


Answers

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

http://en.wikipedia.org/wiki/Salt_%28cryptography%29


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

لمعالجة كل من الأسئلة المضمنة:

كيف يعمل تشفير كلمة المرور؟ كيف سيكون عليك تطبيق تشفير كلمة المرور حتى تكون مفيدة بالفعل؟

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

ماذا عن هذه الفكرة؟

تجزئة كلمة المرور لا تحتاج إلى التعقيد من هذا القبيل ، ولا ينبغي أن تكون كذلك. تجنب التفكير في الخوارزميات الخاصة بك والتعامل مع خوارزميات التجزئة المجربة والمختبرة الموجودة بالفعل. كما ذكر السؤال مرتبط أعلاه ، md5() لتجزئة كلمة المرور قد عفا عليها الزمن لسنوات عديدة الآن ، ولذا ينبغي تجنبها.

طريقتك لتوليد ملح "عشوائي" من صفيف لثلاث أملاح مختلفة ليست هي العشوائية التي تبحث عنها. تحتاج إلى عشوائية فريدة مناسبة للأمان المشفر (أي باستخدام مولد رقم عشوائي شبه عشوائي (CSPRNG)). إذا كنت تستخدم PHP 7 وما فوق ، فيمكن استخدام الدالة random_bytes لإنشاء ملح آمن مشفر (بالنسبة لمستخدمي PHP 5 ، يمكن استخدام مكتبة random_compat ).


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

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

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


هذا هو سؤالي حول جوانب الاصطدام md5 ، المرتبط قليلاً بسؤالك:

هل هناك فرق بين md5 و sha1 في هذه الحالة؟

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


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

http://en.wikipedia.org/wiki/Cryptographic_hash_function


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

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

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

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


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

لذلك ، دعنا نقول كلمة المرور الخاصة بك هي "Trufa" ، 06cb51ce0a9893ec1d2dce07ba5ba710 هو 06cb51ce0a9893ec1d2dce07ba5ba710 .

على سبيل المثال ، عندما تسجل الدخول إلى صفحة ويب جديدة ، فإنها تطلب منك اسم المستخدم وكلمة المرور. عند كتابة "Trufa" ككلمة المرور الخاصة بك ، يتم تخزين القيمة 06cb51ce0a9893ec1d2dce07ba5ba710 في قاعدة البيانات لأنه يتم تجزئته.

في المرة التالية التي تقوم فيها بتسجيل الدخول ، وتكتب "Trufa" ، ستتم مقارنة القيمة المجزأة مع القيمة الموجودة في قاعدة البيانات. إذا كانت هي نفسها ، فأنت مصدق! مما يتيح لك إدخال اسم المستخدم الصحيح ، بطبيعة الحال.

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

أيضا ، منذ MD5 هي وظيفة التشفير 128 بت ، هناك 2 ^ 128-1 = 340282366920938463463374607431768211455 تركيبات ممكنة.

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


هذه الوثائق مضللة - فهي تعلم مفهومًا "ضعيفًا" وتعرضه على أنه "آمن" إلى حد ما لأنه (كلمة المرور المحفوظة) يبدو كأنه رطانة. مجرد خردة الإنترنت التي لن تموت. يجب أن يؤدي الرابط التالي إلى توضيح الأمور (يبدو أنك قد وجدت بالفعل جزءًا جيدًا منها على ما يبدو. عمل جيد.)

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


إن فكرتك (التمليح) معروفة جيدًا ويتم تنفيذها جيدًا بلغة PHP. إذا كنت تستخدم الدالة crypt() ، فيمكنك تحديد سلسلة تجزئة ، طريقة لتشفير (في بعض الحالات) ، وملح. فمثلا،

$x = crypt('insecure_password', $salt);

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


نقطة الضعف الوحيدة مع التمليح هي أنك تحتاج إلى معرفة ما هو الملح من أجل إعادة إنشاء تجزئة لاختبار كلمة المرور. هذا يتم عبر تخزين الإدخال في authdb في النموذج <algorithm>$<salt>$<hash> . بهذه الطريقة يمكن استخدام إدخال authdb بواسطة أي رمز له حق الوصول إليه.


أنا أحب هذا السؤال. لكن أعتقد أنك أجبت على نفسك حقًا.

الموقع الذي أشرت إليه يستخدم عمليات البحث في القاموس المعروفة ، غير مملحة ، md5's - لا "تصدع" أي شيء.

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

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

سيخبرك الناس أيضًا باستخدام SHA1 أو SHA256 ليكون لديهم تجزئة "أقوى" - ولكن سيقول الناس أيضًا إنهم "مكسورون".






php security passwords