
Magic hashes – تصادمات تجزئة PHP
سجّل باستخدام كلمة المرور 1 ثم سجّل الدخول باستخدام كلمة المرور 2. إذا نجح الدخول، فهذا يعني أن التخزين يستخدم الخوارزمية المحددة لتجزئة كلمة المرور وأن PHP تستخدم == للمقارنة بينهما (بالنسبة إلى MD5 وSHA-1 والنص الصريح).
بالنسبة إلى MD5 وSHA-1 وعائلة SHA-2، تستخدم الحيلة المعروفة منذ زمن طويل (وهي في الواقع ميزة موثّقة، انظر و) بحيث يكون في PHP، وتُستخدم هنا لأغراض . أي كلمة مرور أي كلمة مرور أخرى من القائمة. هذه حيلة مختلفة عن ، فقط لاحظ الفرق بين .
'0e1' == '00e2' == '0'هذه هي جميع الخوارزميات ذات التجزئات السحرية:
md5(md5(password))نقتبس من @0xb0bb: "هناك تطبيقات أخرى للتجزئات السحرية بخلاف مقارنات كلمات المرور (مثل طبقات التخزين المؤقت أو البيانات المشتقة من مخرجات دالة التجزئة) حيث يمكن العثور بسهولة أكبر على هذه الخوارزميات المعروفة بعدم أمانها، والأقل شهرة، وخوارزميات التجزئة الزائفة."
بالنسبة إلى النص الصريح، تُستخدم حيل تحويل متنوعة. كلمة المرور الأولى تطابق الثانية فقط. الحيل مُجمّعة حسب إصدارات PHP التي تتيحها.
bcrypt يقتطع كلمات المرور إلى طول أقصى يبلغ 72 حرفًا. تتطابق كلمتا المرور إذا تطابق أول 72 حرفًا من كلا الكلمتين.
descrypt (نظام التشفير DES التقليدي في UNIX) يقتطع كلمات المرور إلى طول أقصى يبلغ 8 أحرف. تتطابق كلمتا المرور أيضًا إذا تطابق أول 8 أحرف من كلا الكلمتين، انظر قسم "التحقق المتبادل العام".
إذا استخدمت كلمة مرور أطول من 64 بايتًا وقمت بتجزئتها باستخدام PBKDF2-HMAC-SHA1، فإنها تُجزأ أولاً مسبقًا باستخدام SHA1، لذا PBKDF2-HMAC-SHA1(password1) === PBKDF2-HMAC-SHA1(password2) لأن sha1(password1) === bin2hex(password2). يُطبَّق التجزئة المسبقة المماثلة في حالة PBKDF2-HMAC-SHA224 وPBKDF2-HMAC-SHA256.
في الوقت الحالي يوجد تجزئة سحرية واحدة فقط في كل منها بفضل Norbert Tihanyi، ونأمل أن يُضاف المزيد في المستقبل.
استخدم === عند مقارنة أي شيء* في PHP، وليس ==. واستخدم password_hash() وpassword_verify() لتجزئة كلمات المرور في PHP، ولا تستخدم MD5 أو SHA-1. *استخدم hash_equals() عند مقارنة التجزئات.
بدأ كل شيء بهذه التغريدة، حيث ولّدتُ QNKCDZO و240610708 في فبراير 2014، ومنذ ذلك الحين انتشر الأمر في كل مكان. فقط ابحث عنه في Google.
استخدمت حاسوبي المحمول، وبضعة حلقات for (أو foreach؟)، والعديد من دورات المعالجة، ومروحة خارجية في عام 2014، لكن يمكنك/يجب عليك اليوم استخدام وحدة معالجة رسومية ونسخة معدّلة من hashcat لهذا الغرض. انظر هذا الشرح من إعداد Carl Löndahl و0xb0bb.
Chick3nman وفريقه يعملون أيضًا على نسختهم من hashcat، ترقبوا.
إذا كنت بحاجة إلى تصادم حقيقي أبجدي رقمي، فإليك تصادم MD5 أبجدي رقمي بطول 72 بايت بفارق 1 بايت، بل حتى 1 بت، من إعداد Marc Stevens:
md5("TEXTCOLLBYfGiJUETHQ4hAcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak")
=
md5("TEXTCOLLBYfGiJUETHQ4hEcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak")
لاحظ أنه إذا سجّلت بكلمة المرور الأولى وسجّلت الدخول بالثانية، فقد لا يزال ذلك يعني أن الموقع يستخدم bcrypt(md5($password)) وليس فقط md5($password). يُستخدم هذا التغليف حول التجزئة أحيانًا عند ترقية تجزئة كلمات المرور لكن يجب استخدامه مؤقتًا فقط.
انظر مشروع HashClash الخاص بـ Marc إذا كنت مهتمًا بهذه التصادمات الحقيقية أو إذا كنت ترغب في إنشاء تصادم خاص بك.
تصادمات LM حقيقية من @solardiz (#35، شكرًا!):
db82323cb0693862: 2275490 أو 0/*LUZ@44b3b60db75c15c1: 2716388 أو 1}DC<XT585e239d32df1998: 8351762 أو $;)5D|Xانظر التغريدة لمعرفة كيفية توليد المزيد.