رمزنگاری پسورد با bcrypt

رمزنگاری پسورد با bcrypt در PHP: یک راهنمای جامع

رمزنگاری پسورد با bcrypt در PHP: یک راهنمای جامع

امنیت پسوردهای کاربران یکی از حیاتی‌ترین جنبه‌های توسعه وب است. ذخیره پسوردها به صورت متن ساده (Plain Text) یک اشتباه امنیتی فاجعه‌بار است. حتی استفاده از توابع هش ساده مانند MD5 یا SHA1 نیز دیگر کافی نیست، زیرا این الگوریتم‌ها به سرعت قابل شکستن هستند. bcrypt یک الگوریتم هش رمزنگاری است که به طور خاص برای ذخیره پسوردها طراحی شده و به دلیل مقاومت بالا در برابر حملات brute-force و dictionary، به طور گسترده‌ای توصیه می‌شود. این مقاله به بررسی عمیق bcrypt، نحوه عملکرد آن، و پیاده‌سازی آن در PHP می‌پردازد.

چرا bcrypt؟

bcrypt بر اساس الگوریتم Blowfish ساخته شده و با افزودن یک “factor” یا “cost” به آن، زمان مورد نیاز برای محاسبه هش را به طور قابل توجهی افزایش می‌دهد. این کار باعث می‌شود که حملات brute-force که سعی در حدس زدن پسوردها با امتحان کردن ترکیبات مختلف دارند، بسیار کند و پرهزینه شوند. علاوه بر این، bcrypt از یک salt تصادفی برای هر پسورد استفاده می‌کند. Salt یک رشته تصادفی است که به پسورد اضافه می‌شود قبل از اینکه هش شود. این کار از حملات rainbow table جلوگیری می‌کند، که در آن مهاجمان از جداول از پیش محاسبه شده هش‌ها برای یافتن پسوردهای اصلی استفاده می‌کنند.

ویژگی‌های کلیدی bcrypt:

  • Adaptive Hashing: bcrypt به طور خودکار با افزایش قدرت سخت‌افزار، سختی هش را افزایش می‌دهد.
  • Salting: استفاده از salt تصادفی برای هر پسورد، امنیت را به طور چشمگیری افزایش می‌دهد.
  • مقاومت در برابر Brute-Force: افزایش زمان مورد نیاز برای محاسبه هش، حملات brute-force را غیرعملی می‌کند.
  • مقاومت در برابر Rainbow Table: استفاده از salt از استفاده از جداول از پیش محاسبه شده هش‌ها جلوگیری می‌کند.

نحوه عملکرد bcrypt

فرآیند رمزنگاری پسورد با bcrypt به شرح زیر است:

  1. تولید Salt: یک رشته تصادفی به عنوان salt تولید می‌شود.
  2. افزودن Salt به پسورد: Salt به پسورد کاربر اضافه می‌شود.
  3. هش کردن: مخلوط پسورد و salt با استفاده از الگوریتم bcrypt و یک factor (cost) مشخص، هش می‌شود.
  4. ذخیره هش و Salt: هش تولید شده و salt در پایگاه داده ذخیره می‌شوند. توجه: پسورد اصلی هرگز ذخیره نمی‌شود.

هنگامی که کاربر سعی در ورود به سیستم دارد، فرآیند به شرح زیر است:

  1. دریافت پسورد وارد شده: پسورد وارد شده توسط کاربر دریافت می‌شود.
  2. دریافت Salt از پایگاه داده: Salt مربوط به کاربر از پایگاه داده بازیابی می‌شود.
  3. افزودن Salt به پسورد وارد شده: Salt بازیابی شده به پسورد وارد شده اضافه می‌شود.
  4. هش کردن: مخلوط پسورد وارد شده و salt با استفاده از همان الگوریتم bcrypt و factor (cost) که در هنگام ثبت نام استفاده شده بود، هش می‌شود.
  5. مقایسه هش‌ها: هش تولید شده با هش ذخیره شده در پایگاه داده مقایسه می‌شود. اگر هش‌ها یکسان باشند، پسورد صحیح است و کاربر مجاز به ورود به سیستم است.

پیاده‌سازی bcrypt در PHP

PHP دارای یک تابع داخلی به نام password_hash() است که برای رمزنگاری پسوردها با استفاده از الگوریتم‌های مختلف، از جمله bcrypt، طراحی شده است. همچنین، تابع password_verify() برای تأیید پسورد وارد شده در برابر هش ذخیره شده در پایگاه داده استفاده می‌شود.

رمزنگاری پسورد (Hashing)

برای رمزنگاری پسورد با استفاده از bcrypt در PHP، می‌توانید از کد زیر استفاده کنید:


در این کد، تابع password_hash() پسورد را به عنوان ورودی دریافت می‌کند و یک هش bcrypt تولید می‌کند. پارامتر PASSWORD_BCRYPT مشخص می‌کند که از الگوریتم bcrypt استفاده شود. به طور پیش‌فرض، PHP یک cost factor مناسب را انتخاب می‌کند، اما می‌توانید با استفاده از پارامتر اختیاری سوم، cost factor را به صورت دستی تنظیم کنید. به عنوان مثال:

 12]);
?>

مقدار cost factor بین 4 تا 31 است. هرچه مقدار cost factor بیشتر باشد، زمان مورد نیاز برای محاسبه هش بیشتر می‌شود و امنیت بالاتر می‌رود، اما عملکرد نیز کاهش می‌یابد. مقدار 12 معمولاً یک نقطه شروع خوب است.

تأیید پسورد (Verification)

برای تأیید پسورد وارد شده توسط کاربر در برابر هش ذخیره شده در پایگاه داده، می‌توانید از کد زیر استفاده کنید:


در این کد، تابع password_verify() پسورد وارد شده و هش ذخیره شده را به عنوان ورودی دریافت می‌کند. اگر پسورد وارد شده با هش ذخیره شده مطابقت داشته باشد، تابع true را برمی‌گرداند، در غیر این صورت false را برمی‌گرداند.

نکات مهم امنیتی

  • همیشه از bcrypt استفاده کنید: bcrypt یکی از امن‌ترین الگوریتم‌های هش رمزنگاری برای ذخیره پسوردها است.
  • از Salt استفاده کنید: تابع password_hash() به طور خودکار از salt استفاده می‌کند، بنابراین نیازی به تولید و ذخیره salt به صورت جداگانه نیست.
  • Cost Factor را تنظیم کنید: Cost factor را بر اساس قدرت سخت‌افزار خود تنظیم کنید. مقدار 12 معمولاً یک نقطه شروع خوب است.
  • هش را به درستی ذخیره کنید: هش تولید شده را در پایگاه داده ذخیره کنید. هرگز پسورد اصلی را ذخیره نکنید.
  • از حملات SQL Injection جلوگیری کنید: هنگام بازیابی هش از پایگاه داده، از حملات SQL Injection جلوگیری کنید.
  • به روز رسانی الگوریتم‌ها: همیشه از آخرین نسخه PHP استفاده کنید و الگوریتم‌های رمزنگاری خود را به طور منظم به روز رسانی کنید.

نتیجه‌گیری

bcrypt یک الگوریتم هش رمزنگاری قوی و قابل اعتماد است که برای ذخیره پسوردها به طور ایمن طراحی شده است. با استفاده از توابع داخلی PHP مانند password_hash() و password_verify()، پیاده‌سازی bcrypt در برنامه‌های PHP بسیار آسان است. با رعایت نکات امنیتی ذکر شده در این مقاله، می‌توانید امنیت پسوردهای کاربران خود را به طور قابل توجهی افزایش دهید و از آن‌ها در برابر حملات مختلف محافظت کنید.