PHP Crypt and Salt - المزيد من التوضيح من فضلك
-
25-09-2019 - |
سؤال
كنت هنا بالأمس وحصلت على بعض الإجابات الرائعة حقًا. أخذت ما حصلت عليه ووضعته معًا ، ما أعتقد أنه سيكون خوارزمية آمنة إلى حد ما. أواجه مشكلة في استخدام Blowfish مع حلقة تولد الملح.
أنا أستخدم أحرف BASE64 و LOOP للحصول على سلسلة عشوائية. أريد أن آخذ هذه السلسلة التي تم إنشاؤها وإدخالها في وظيفة سرداب كملح.
نظرًا لأن الوثائق حول Blowfish متناثرة جدًا ولم تذكرها مستندات PHP حقًا ، فأنا أطرح في الظلام هنا.
الشيء الغريب حقًا هو إذا قمت بتشغيل هذا الرمز بالطريقة التي سيحدثها الآن ، فسيتم ذلك ليس يفشل. إزالة أيضاً "2A $ 07 $" من فوق الحلقة أو من وظيفة سرداب وستفعل ذلك بشكل متقطع إرجاع سلسلة مشفرة. فهمي لأسماك النفخ هو أن السلسلة المشفرة يجب ابدأ بـ "$ 2A $ 07 $" وينتهي في "$" وبالتالي التسلسل في وظيفة crypt. لا أحتاج حقًا إلى سلسلة البداية أعلى من الحلقة وأردت فقط التخلص منها.
أود أيضًا توضيحًا حول أفضل الممارسات في تخزين الملح العشوائي ، إما في قاعدة البيانات أو عن طريق تخزين إخراج وظيفة سرداب في قاعدة البيانات؟
بالأمس ، لم يكن هناك رمز حقيقي يتم طرحه ، فقط مناقشة. أرغب في وضع بعض التعليمات البرمجية معًا اليوم ولدي شيء آمن إلى حد ما. إذا تمكن أي شخص من الخروج بخوارزمية أفضل ، فأنا منفتح دائمًا.
$base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$salt = '$2a$07$';
for($i=0; $i<60; $i++)
{
$salt .= $base64[rand(0,63)];
}
return crypt('password', '$2a$07$'.$salt.'$');
المحلول
يبدو أن crypt()
يكره +
Char in the Salt ، والكثير من chars الخاصة الأخرى (*
, %
إلخ). إذا قمت بتصفيةها ، فيجب أن تعمل على كل تجربة (ولا حاجة لتكرار سلسلة معرف الملح).
نصائح أخرى
أعلم أن هذا السؤال هو تاريخ قديم من الناحية العملية الآن ، ولكن لصالح أي شخص يجده من خلال البحث عن Google ، هناك وصف مفصل جدًا لكيفية عمل أملاح Bcrypt/Eksblowfish في إجابة هذا السؤال:
لماذا يولد سرداب/أسماك النفخ نفس التجزئة بأملاحين مختلفين؟
الجواب المختصر هو ، كما قال CAF ، يستخدم الأبجدية BASE64 مكونة من [a-zA-Z0-9./]
, ، مع $
كما NULL (وليس 0) الطرف إنهاء/الحشو. إذا كنت تستخدم أي أحرف خارج هذا النطاق ، أو أ $
في وقت مبكر جدا ، سوف يكون إما خطأ أو لا يفسر كامل الملح.