آموزش رایگان PHP

آموزش جامع رمزنگاری پسورد با password_hash در PHP بر اساس استاندارد گوگل

1405/05/14 22:07 محراب حسن زاده
آموزش جامع رمزنگاری پسورد با password_hash در PHP بر اساس استاندارد گوگل

مقدمه: چرا روش‌های قدیمی رمزنگاری دیگر امن نیستند؟

در گذشته برنامه نویسان برای حفظ امنیت کلمات عبور از توابعی مانند md5 یا sha1 استفاده می‌کردند. امروزه به دلیل افزایش قدرت پردازشی کامپیوترها و وجود جداول Rainbow Tables، این توابع به شدت در برابر حملات Brute Force آسیب‌پذیر هستند. بر اساس استانداردهای امنیتی گوگل و سازمان امنیت وب (OWASP)، ذخیره‌سازی پسوردها باید با استفاده از الگوریتم‌های هشینگ تطبیق‌پذیر (Adaptive Hashing Algorithms) مانند Bcrypt یا Argon2 انجام شود.

آشنایی با تابع password_hash در PHP

از نسخه PHP 5.5 به بعد، تابع قدرتمند password_hash() معرفی شد. این تابع فرآیند هش کردن پسورد را به ساده‌ترین شکل ممکن و با بالاترین ضریب امنیت انجام می‌دهد. مزیت بزرگ این تابع این است که به صورت خودکار برای هر پسورد یک Salt (نمک) کاملاً تصادفی و منحصر‌به‌فرد تولید می‌کند.

سینتکس پایه این تابع به شکل زیر است:

password_hash(string $password, string|int|null $algo, array $options = []): string
  • $password: کلمه عبور خام کاربر.
  • $algo: الگوریتم رمزنگاری (به طور پیش‌فرض PASSWORD_DEFAULT پیشنهاد می‌شود).
  • $options: تنظیمات اختیاری مانند تعیین ضریب سختی پردازش (Cost).

پیاده‌سازی گام به گام: هش کردن پسورد هنگام ثبت نام

هنگامی که کاربر جدیدی در سایت شما ثبت نام می‌کند، باید پسورد وارد شده را قبل از ذخیره در دیتابیس با این تابع هش کنید. به نمونه کد زیر دقت کنید:


// کلمه عبور دریافتی از کاربر
$userPassword = "MySecureP@ssw0rd!";

// هش کردن پسورد با الگوریتم پیش‌فرض (Bcrypt)
$hashedPassword = password_hash($userPassword, PASSWORD_DEFAULT);

// نمایش هش تولید شده (این رشته را باید در دیتابیس ذخیره کنید)
echo $hashedPassword;

خروجی این تابع یک رشته ۶۰ کاراکتری است که همیشه با کاراکترهایی مثل $2y$ شروع می‌شود. این پیشوند نشان‌دهنده الگوریتم استفاده شده و تنظیمات مربوط به آن است.

تایید پسورد هنگام ورود (Login) با تابع password_verify

از آنجا که عملیات هشینگ یک‌طرفه است، شما نمی‌توانید پسورد هش شده را به حالت اولیه بازگردانید. برای بررسی صحت پسورد وارد شده توسط کاربر در فرم ورود، باید از تابع password_verify() استفاده کنید:


// پسورد وارد شده در فرم ورود
$loginPassword = "MySecureP@ssw0rd!";

// هش ذخیره شده در دیتابیس (نمونه)
$storedHash = '$2y$10$e0MYzXyObK2E8y8L/67yA.E5P.8WByS93Q7.wO6w1Gf2RjGgUv8t2';

// تایید پسورد
if (password_verify($loginPassword, $storedHash)) {
    echo "ورود با موفقیت انجام شد!";
} else {
    echo "کلمه عبور اشتباه است!";
}

تنظیمات پیشرفته: افزایش امنیت با پارامتر Cost

الگوریتم Bcrypt از پارامتری به نام cost استفاده می‌کند که میزان سختی و زمان پردازش برای تولید هش را مشخص می‌کند. مقدار پیش‌فرض این پارامتر ۱۰ است. اگر سرور قدرتمندی دارید، می‌توانید برای بالا بردن امنیت در برابر حملات سخت‌افزاری، این مقدار را افزایش دهید:


$options = [
    'cost' =--> 12, // افزایش سختی پردازش
];

$hashedPassword = password_hash($userPassword, PASSWORD_BCRYPT, $options);

توصیه‌های امنیتی گوگل برای ذخیره کلمات عبور

  1. طول فیلد دیتابیس: همیشه طول فیلد مربوط به ذخیره پسورد در دیتابیس (مثلاً در MySQL) را حداقل VARCHAR(255) قرار دهید تا در صورت تغییر الگوریتم پیش‌فرض PHP در آینده به الگوریتم‌های طولانی‌تر (مثل Argon2)، دیتابیس دچار مشکل نشود.
  2. عدم استفاده از Salt دستی: از تولید دستی Salt خودداری کنید. تابع password_hash() این کار را به امن‌ترین شکل ممکن به صورت خودکار انجام می‌دهد.
  3. بروزرسانی مداوم: با استفاده از تابع password_needs_rehash() می‌توانید بررسی کنید که آیا پسوردهای قدیمی نیاز به رمزنگاری مجدد با الگوریتم‌های جدیدتر دارند یا خیر.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

الگوهای رایج برنامه‌نویسی ناهمگام در جاوا اسکریپت: Promise.race، Promise.all، و Promise.any کامل و مثال‌ها
1403/08/01 19:08

الگوهای رایج برنامه‌نویسی ناهمگام در جاوا اسکریپت: Promise.race، Promise.all، و Promise.any کامل و مثال‌ها

مطالعه بیشتر
آموزش mix-blend-mode و background-blend-mode در CSS: ترکیب رنگ‌ها و ایجاد افکت‌های جذاب
1403/08/12 20:18

آموزش mix-blend-mode و background-blend-mode در CSS: ترکیب رنگ‌ها و ایجاد افکت‌های جذاب

مطالعه بیشتر
آموزش کامل و امن آپلود فایل در PHP (مطابق استاندارد گوگل)
1405/05/01 20:17

آموزش کامل و امن آپلود فایل در PHP (مطابق استاندارد گوگل)

مطالعه بیشتر
آموزش CSS Blend Modes: ادغام رنگ‌ها و تصاویر برای طراحی وب جذاب
1403/08/09 20:29

آموزش CSS Blend Modes: ادغام رنگ‌ها و تصاویر برای طراحی وب جذاب

مطالعه بیشتر
پارامترها و بازگشت از توابع در جاوا اسکریپت: نحوه تعریف و مدیریت خروجی‌ها
1402/11/02 23:32

پارامترها و بازگشت از توابع در جاوا اسکریپت: نحوه تعریف و مدیریت خروجی‌ها

مطالعه بیشتر
آموزش ساخت افکت تصویر با تم اینستاگرام و انیمیشن چرخش دوره‌ای در CSS
1405/03/13 01:45

آموزش ساخت افکت تصویر با تم اینستاگرام و انیمیشن چرخش دوره‌ای در CSS

مطالعه بیشتر
آموزش جامع ساخت فرم ورود کاربر در PHP (براساس استانداردهای گوگل و امنیت بالا)
1405/05/14 22:03

آموزش جامع ساخت فرم ورود کاربر در PHP (براساس استانداردهای گوگل و امنیت بالا)

مطالعه بیشتر
آموزش جامع و کاربردی کار با فایل‌ها در PHP
1405/05/04 23:14

آموزش جامع و کاربردی کار با فایل‌ها در PHP

مطالعه بیشتر
عملگرها و عبارات محاسباتی در جاوا اسکریپت: نحوه استفاده و کاربردهای مختلف
1402/06/28 00:20

عملگرها و عبارات محاسباتی در جاوا اسکریپت: نحوه استفاده و کاربردهای مختلف

مطالعه بیشتر
آموزش تکنیک‌های پیشرفته CSS Grid: طراحی ساختارهای پیچیده و واکنش‌گرا
1402/06/18 23:16

آموزش تکنیک‌های پیشرفته CSS Grid: طراحی ساختارهای پیچیده و واکنش‌گرا

مطالعه بیشتر
آموزش صفحه‌بندی اطلاعات در PHP به صورت اصولی و مطابق استانداردهای سئو گوگل
1405/05/13 21:21

آموزش صفحه‌بندی اطلاعات در PHP به صورت اصولی و مطابق استانداردهای سئو گوگل

مطالعه بیشتر
آموزش جامع تعریف تابع سفارشی در PHP طبق استاندارد گوگل و PSR
1405/04/16 01:07

آموزش جامع تعریف تابع سفارشی در PHP طبق استاندارد گوگل و PSR

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد