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

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آموزش توسعه بازی‌های ساده با استفاده از جاوا اسکریپت و Canvas API: راهنمای گام به گام
1403/08/05 21:06

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

مطالعه بیشتر
توابع فلش (Arrow Functions) در جاوا اسکریپت: ساده‌سازی کد با استفاده از ES6
1403/06/02 20:36

توابع فلش (Arrow Functions) در جاوا اسکریپت: ساده‌سازی کد با استفاده از ES6

مطالعه بیشتر
آشنایی با Emit در Vue.js | انتقال رویدادها از کامپوننت فرزند به والد
1404/09/24 20:52

آشنایی با Emit در Vue.js | انتقال رویدادها از کامپوننت فرزند به والد

مطالعه بیشتر
مدیریت خطاها در Async/Await و Promises در جاوا اسکریپت: راهنمای کامل با مثال‌های عملی
1403/07/30 20:59

مدیریت خطاها در Async/Await و Promises در جاوا اسکریپت: راهنمای کامل با مثال‌های عملی

مطالعه بیشتر
آموزش کامل include و require در PHP + تفاوت‌های کلیدی و کاربردی
1405/05/01 20:28

آموزش کامل include و require در PHP + تفاوت‌های کلیدی و کاربردی

مطالعه بیشتر
آموزش مدیریت Box Model و ترکیب اجزای آن با CSS: کنترل دقیق فاصله‌ها و ابعاد عناصر
1402/06/05 23:30

آموزش مدیریت Box Model و ترکیب اجزای آن با CSS: کنترل دقیق فاصله‌ها و ابعاد عناصر

مطالعه بیشتر
آموزش ساخت اولین فایل PHP و بررسی ساختار تگ‌ها بر اساس استاندارد وب
1405/03/15 00:08

آموزش ساخت اولین فایل PHP و بررسی ساختار تگ‌ها بر اساس استاندارد وب

مطالعه بیشتر
راهنمای جامع قوانین نام‌گذاری متغیرها در PHP بر اساس استاندارد گوگل
1405/03/24 00:57

راهنمای جامع قوانین نام‌گذاری متغیرها در PHP بر اساس استاندارد گوگل

مطالعه بیشتر
آموزش جامع Session در PHP به زبان ساده + پروژه عملی شبیه‌ساز
1405/05/01 20:07

آموزش جامع Session در PHP به زبان ساده + پروژه عملی شبیه‌ساز

مطالعه بیشتر
آموزش جامع مدیریت خطا با Try Catch و Exception در PHP (اصول و استانداردهای تمیز)
1405/05/01 20:26

آموزش جامع مدیریت خطا با Try Catch و Exception در PHP (اصول و استانداردهای تمیز)

مطالعه بیشتر
آشنایی با Inheritance در CSS: اصول وراثت و مدیریت استایل‌ها
1403/08/12 19:59

آشنایی با Inheritance در CSS: اصول وراثت و مدیریت استایل‌ها

مطالعه بیشتر
آموزش ساخت یک برنامه ساده با Fetch API در جاوا اسکریپت: راهنمای گام به گام
1403/08/01 20:16

آموزش ساخت یک برنامه ساده با Fetch API در جاوا اسکریپت: راهنمای گام به گام

مطالعه بیشتر

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