
Magic hashes – تصادمات تجزئة PHP
سجّل باستخدام كلمة المرور 1 ثم سجّل الدخول باستخدام كلمة المرور 2. إذا نجح الدخول، فهذا يعني أن التخزين يستخدم الخوارزمية المحددة لتجزئة كلمة المرور وأن PHP تستخدم == للمقارنة بينهما (بالنسبة إلى MD5 وSHA-1 والنص الصريح).
بالنسبة إلى MD5 وSHA-1 وعائلة SHA-2، تستخدم الحيلة المعروفة منذ زمن طويل (وهي في الواقع ميزة موثّقة، انظر جداول مقارنة الأنواع في PHP وأرقام الفاصلة العائمة) بحيث يكون '0e1' == '00e2' == '0' في PHP، وتُستخدم هنا لأغراض عملية. أي كلمة مرور تطابق أي كلمة مرور أخرى من القائمة. هذه حيلة مختلفة عن السلاسل الصحيحة التي تفيض إلى أرقام فاصلة عائمة، فقط لاحظ الفرق بين هذين السطرين.
هذه هي جميع الخوارزميات ذات التجزئات السحرية:
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.