آموزش جامع رمزنگاری پسورد با 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);
توصیههای امنیتی گوگل برای ذخیره کلمات عبور
- طول فیلد دیتابیس: همیشه طول فیلد مربوط به ذخیره پسورد در دیتابیس (مثلاً در MySQL) را حداقل VARCHAR(255) قرار دهید تا در صورت تغییر الگوریتم پیشفرض PHP در آینده به الگوریتمهای طولانیتر (مثل Argon2)، دیتابیس دچار مشکل نشود.
- عدم استفاده از Salt دستی: از تولید دستی Salt خودداری کنید. تابع
password_hash()این کار را به امنترین شکل ممکن به صورت خودکار انجام میدهد. - بروزرسانی مداوم: با استفاده از تابع
password_needs_rehash()میتوانید بررسی کنید که آیا پسوردهای قدیمی نیاز به رمزنگاری مجدد با الگوریتمهای جدیدتر دارند یا خیر.
پرسش و پاسخ
نظری یافت نشد
برای ارسال نظر ابتدا وارد شوید