آموزش رایگان 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() می‌توانید بررسی کنید که آیا پسوردهای قدیمی نیاز به رمزنگاری مجدد با الگوریتم‌های جدیدتر دارند یا خیر.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

معرفی React.js و بررسی مزایای آن برای توسعه وب و اپلیکیشن
1402/06/28 00:59

معرفی React.js و بررسی مزایای آن برای توسعه وب و اپلیکیشن

مطالعه بیشتر
نصب Node.js و Create React App: شروع پروژه‌های React.js به‌صورت آسان
1402/06/28 01:09

نصب Node.js و Create React App: شروع پروژه‌های React.js به‌صورت آسان

مطالعه بیشتر
آموزش ایجاد یک پروژه ساده React: شروع کار و ساختاردهی کامپوننت‌ها
1402/06/28 23:04

آموزش ایجاد یک پروژه ساده React: شروع کار و ساختاردهی کامپوننت‌ها

مطالعه بیشتر
آموزش ارتباط با سرور و ارسال درخواست‌های HTTP با Fetch API در جاوا اسکریپت: راهنمای جامع با مثال‌ها
1403/08/01 19:55

آموزش ارتباط با سرور و ارسال درخواست‌های HTTP با Fetch API در جاوا اسکریپت: راهنمای جامع با مثال‌ها

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

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

مطالعه بیشتر
معرفی Vue.js و ویژگی‌های کلیدی آن: فریمورک مدرن برای توسعه وب تعاملی
1402/06/28 00:33

معرفی Vue.js و ویژگی‌های کلیدی آن: فریمورک مدرن برای توسعه وب تعاملی

مطالعه بیشتر
آموزش جامع اتصال به دیتابیس با PDO در PHP
1405/05/04 23:42

آموزش جامع اتصال به دیتابیس با PDO در PHP

مطالعه بیشتر
آموزش تگ‌های زمان و مکان در HTML: استفاده از time و location در صفحات وب
1402/05/29 21:13

آموزش تگ‌های زمان و مکان در HTML: استفاده از time و location در صفحات وب

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

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

مطالعه بیشتر
آموزش جامع مدیریت خطاها در PHP بر اساس استانداردهای گوگل
1405/05/01 20:23

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

مطالعه بیشتر
آموزش ایجاد تگ‌های صفحه‌بندی در HTML و CSS: طراحی و استایل‌دهی pagination
1402/05/29 21:27

آموزش ایجاد تگ‌های صفحه‌بندی در HTML و CSS: طراحی و استایل‌دهی pagination

مطالعه بیشتر
کار با فیلترهای CSS: آموزش استفاده از blur، brightness و contrast برای افکت‌های تصویری جذاب
1403/08/11 21:08

کار با فیلترهای CSS: آموزش استفاده از blur، brightness و contrast برای افکت‌های تصویری جذاب

مطالعه بیشتر

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