• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
تابع رندوم امن - خشت اول چون نهاد معمار کج ...!
#1
میدونید که در وب از توابع رندوم برای مقاصد امنیتی خیلی زیاد استفاده میشه.
رشته های رندوم در وب کاربرد گسترده و اساسی دارن. ما واقعا بهشون نیازمندیم.
مثلا کد فعال سازی، انواع Token های امنیتی، حتی کلیدهای رمزنگاری، ... .
اینها معمولا با استفاده از توابع استاندارد PHP مثل rand, mt_rand, microtime و البته روشهای ترکیبی ای و پیشرفته تری که بعضی ها از خودشون ابداع میکنن تولید میشن.

اما آیا این توابع و روشها بقدر کافی امن هستند که بتونیم برای تمام این موارد و در تمام سطوح حساسیت امنیتی بهشون اعتماد کنیم؟

میتونم براحتی ادعا کنم که پاسخ قطعی یک حرفه ای و متخصص به این پرسش کلی این است: خیر!

چرا؟

چون توابع رندوم PHP از نوع توابع رندوم امنیتی و مناسب استفاده در مصارف رمزنگاری نیستند. و چون روشهای شخصی اختراع شده توسط برنامه نویسان هم گرچه بعضا میتوانند به امنیت بالاتری دست بیابند اما هنوز از نظر اصول علم امنیت و رمزنگاری ضعفهای زیاد و بزرگی دارند و امنیت آنها درحد استانداردهای رسمی و حرفه ای نیست؛ چون توسط افراد دارای تخصص لازم (تخصص در علم رمزنگاری/Cryptography) طراحی نشده و این روشها تحقیق و دلیل و سند خاصی هم بعنوان پشتوانه ندارند.

و اما بنده در اینجا یک تابع رندوم امن رو براتون میذارم (فایل ضمیمه)، که توصیه میکنم برای تولید تمام دیتای رندوم خودتون که اهمیت امنیتی داره ازش استفاده کنید.

این تابع رو از کتابخانهء رمزنگاری phpseclib کش رفتم و البته یک مقدار قابل توجهی بهبود و تغییراتی هم درش داده شده که این کار رو با همکاری و کمک و تایید خود توسعه دهندهء کتابخانهء phpseclib انجام دادم.

در فایل ضمیمه شده سه تابع مشاهده میکنید، اما تابع اصلی تابع crypt_random است که میشه گفت معادل امن تابع mt_rand است؛ بقیهء توابع ارائه شده از crypt_random بعنوان هستهء خود استفاده میکنند.

ضمنا اون خط $entropy=sha1... هم که قبل از تابع اومده جزیی از سیستم تولید اعداد رندوم هست ولی باید خارج از تابع قرار بگیره.

و اما مثالهای استفاده:

تولید یک عدد رندوم از 1 تا 10:
کد:
crypt_random(1, 10)

یک عدد رندوم از 0 تا 2147483647:
کد:
crypt_random()

یک رشتهء باینری رندوم با طول 16 بایت (128 بیت):
کد:
random_bytes(16)
توضیح اینکه اینطور رشته های رندوم باینری اغلب بعنوان کلیدهای رمزنگاری متقارن استفاده میشن (توسط الگوریتم هایی مثل AES).

یک رشتهء رندوم به طول 22 کاراکتر، متشکل از حروف بزرگ و کوچک و اعداد:
کد:
random_string(22)

یک رشتهء رندوم به طول 12 کاراکتر، که فقط از کاراکترهای A, B, C و 1, 2, 3 تشکیل شده باشه:
کد:
random_string(12, '123ABC')


فایل‌های پیوست
.zip   secure_rand.zip (اندازه 1.83 KB / تعداد دانلود: 51)
  پاسخ
تشکر شده توسط : admin oia mohsened ali786 Bojbaj
#2
کد:
$code = sha1(uniqid(rand(), true));
  پاسخ
تشکر شده توسط :
#3
دوست عزیز همونطور که توی پستهای قبلی vejmad به صورت کامل توضیح داده شده تابع random یک شبه رندم هست
  پاسخ
تشکر شده توسط :
#4
(۱۳۹۱ تير ۲۸, ۱۰:۱۱ ب.ظ)us12 نوشته:
کد:
$code = sha1(uniqid(rand(), true));
rand و uniqid هردوشون از منابع آنتروپی خیلی محدودی استفاده میکنن. منابعی مثل زمان جاری و PID.
ترکیب اینها با هم امنیت رو چندان بالاتر نمیبره.
و بهرحال شما باید فرض کنید نفوذگر الگوریتم رو داره، چون اگر امنیت رو بر اساس این فرض نذارید، از «امنیت از طریق تیرگی» استفاده کردید که تقریبا همیشه یک روش غیراصولی و ضعیف بحساب میاد.
حالا شاید برای بعضی مصارف امنیت اینطور روشها هم کفایت بکنه، ولی برای بعضی مصارف دیگر هم اینطور نیست. مثلا این روشها برای تولید کلیدهای رمزنگاری اصلا امنیت کافی ندارن. برای بعضی مصارف دیگر هم بهرحال هم یک روزهء شک داره (باید حالتها و سناریوهای مختلف رو محاسبه کنیم و خیلی پارامترها رو درنظر بگیریم).
پس بهتره یک تابع رندوم داشته باشیم با امنیت بالا، و بعد در تمام کاربردها ازش براحتی و با خیال راحت استفاده کنیم. یک بار برای همیشه مشکل امنیت منبع رندوم خودمون رو حل کنیم!
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان