آهان یه نکتهء مهم که یادم رفت بگم!
شما میتونید یه کاری بکنید که امنیت توابع رندوم حتی از نوع ضعیف رو خیلی بالاتر ببره.
اون کار استفاده از یک pepper هست.
pepper یک رشتهء رندومه که با عملیات دیگه ترکیب میشه. این رشتهء رندوم رو معمولا با دست ست میکنن و میتونید توی کد برنامه hardcode اش کنید. هرچند اگر جای امن تری باشه اصولی تره، ولی احتمالا بازم حکایت آدمهای معمولی و برنامه های معمولی هست و اینکه این همه محکم کاری و هزینه واسه درب خونه ای که پنجره هاش براحتی شکسته میشه چندان دلیل معقولی نداره!
مثلا همین کدی که گذاشتید رو من بهش یک pepper اضافه میکنم:
$pepper='kdlpfiia*%^hdjnHH0A@';
md5($pepper.uniqid(mt_rand(0, mt_getrandmax()), true));
الان بنظرتون هکر وقتی مقدار pepper رو نمیدونه، چکار میتونه بکنه بیچاره؟!
البته pepper جای توابع رندوم امنیتی رو نمیگیره، ولی امنیت رو خیلی بالاتر میبره.
در تابع رندوم امنیتی که بنده نوشتم از pepper هم استفاده کردم! یعنی دیگه کم و کسر نداره.
ضمنا pepper در بحث هش پسورد هم به همین شکل و به دلایل مشابهی کاربرد داره و اصلا اسمش رو من از اونجا گرفتم؛ شاید در این کاربرد رندوم بعنوان اسم رسمی درست نباشه بهش بگیم pepper.
ضمنا حتما دقت میفرمایید که اگر pepper رو در هر مورد از نصب برنامه تغییر ندیم، طبیعتا امنیت افزودهء چندانی ایجاد نمیکنه، چون فرض بر اینه که هکر الگوریتم رو میدونه و کد برنامه رو داره. مثلا من در پروژهء رجیستر و لاگین خودم pepper با مقدار اولیه ای که hardcode کردم دارم، ولی از نسخهء اول برنامه دیگه هیچوقت اون رو تغییر ندادم و فکر هم نمیکنم حتی وقتی برنامه رو جایی نصب کنم هم این کار رو براحتی انجام بدم! یخورده تنبلی ایناس دیگه
طبیعتا هکر ممکنه حدس بزنه و تست کنه که آیا من در برنامم pepper رو از مقدار پیشفرضی که توی سورس کدهایی که در github در دسترس همه هست تغییر دادم یا نه. البته از اونور چون امنیت تابع رندوم من همینطوریش هم خیلی بالاست، فکر نمیکنم کسی دنبال این فکر هم باشه و اگر هم باشه بازم چندان فرقی نمیکنه و به نتیجه نمیرسه!
البته در بحث هش pepper مهمتر هست که تغییر داده بشه و به یک مقدار جدید ست بشه، چون در هش ما با پسوردهای کاربران سر و کار داریم که آنتروپی کمی دارن، نه رشته های رندوم تولید شده توسط توابع رندوم امنیتی گردن کلفت!
پس این از نظر امنیتی خیلی مفید محسوب میشه که pepper رو موقع نصب برنامه تغییر بدیم، ولی کمتر کسی این کار رو میکنه و حتی خود منم هیچوقت تاحالا این کار رو نکردم! مثلا در نصب وردپرس هم یک چنین رشته های رندومی رو شاید توی فایل کانفیگ دیده باشید که درواقع کم و بیش همین داستانه، ولی بیشتر افراد اصلا نمیدونن اونا چی هستن چه کاربردی دارن، و حتی یکی مثل من که میدونه هم به خودش زحمت ست کردن اونا رو نمیده. البته یک دلیل این بی میلی اینه که با تغییر این رشته ها یکسری پیچیدگی های دیگه معمولا در نگهداری سیستم پیش میاد (مثلا هش پسوردهای کاربران در دیتابیس به این pepper وابسته است که اگر برنامه رو دوباره نصب کنید و pepper رو به همون مقداری که زمان تولید شدن هش ها بوده ست نکنید اونوقت امکان لاگین کاربران از بین میره و همهء پسوردها باید ریست بشن).
بهرحال در درجهء اول این مهمه که pepper از مقدار پیشفرض که در کدهای منبع در دسترس دیگران بوده تغییر داده بشه. در درجهء بعد هم حتی از هر سایت به سایت که نصب میکنید باید pepper رو تغییر بدید.