كيفية توليد ملح عشوائي طويل للاستخدام في التجزئة؟

StackOverflow https://stackoverflow.com/questions/2235434

  •  19-09-2019
  •  | 
  •  

سؤال

ما هي وسيلة في PHP لصنع ملح عشوائيا ومتغيرا للاستخدام في التجزئة؟ دعنا نقول أنني أريد أن أجعل الملح الطويل من 16 حرفا - كيف أفعل ذلك؟

لا يوجد حل صحيح

نصائح أخرى

تحرير: تم إهمال ملحق MCRYPT. لمشروعات جديدة نلقي نظرة على
Random_Bytes (بطول دولار الدولي)
و ال صوديوم (اعتبارا من امتداد PHP 7.2 Core).


إذا كان Mcrypt تمديد متاح يمكنك ببساطة استخدام MCRYPT_CREATE_IV (الحجم، المصدر) لخلق الملح.

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
var_dump($iv);

نظرا لأن كل بايت من "السلسلة" يمكن أن يكون في النطاق بين 0-255 تحتاج إلى وظيفة آمنة ثنائية لحفظ / استرجاعه.

اعتمادا على نظام التشغيل الخاص بك، شيء مثل:

$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);

هل قرأت عن سلوك عشوائي وأورندوم.

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

جيم

هنا هو أنني وجدت وظيفة لتوليد سلسلة عشوائية:

/* random string */
function rand_string( $length ) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
    $size = strlen( $chars );
    for( $i = 0; $i < $length; $i++ ) {
        $str .= $chars[ rand( 0, $size - 1 ) ];
    }
    return $str;
}

هناك شرطان أساسيان للملح الجيد: يجب أن يكون طويلا، ويجب أن يكون عشوائيا. هناك العديد من الطرق لتحقيق ذلك. يمكنك استخدام مزيج من microtime و rand, على سبيل المثال، ولكن قد تذهب إلى أطوال أكبر للتأكد من أن ملحك فريدا.

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

تحرير: استبدال rand() بالنسبة mt_rand(). وبعد كما لاحظ مايكل، إنه أفضل من rand.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top