آموزش کامل کار با تابع password_verify در PHP (امنیت رمز عبور)
مقدمهای بر امنیت رمز عبور و هشینگ در PHP
هنگام طراحی هر سیستم کاربری، امنیت رمزهای عبور کاربران اولویت شماره یک شما است. در گذشته، توسعهدهندگان از الگوریتمهایی مانند MD5 یا SHA1 برای هش کردن استفاده میکردند. امروزه این الگوریتمها در برابر حملات Brute-force و جداول Rainbow کاملاً آسیبپذیر هستند. طبق استانداردهای امنیتی گوگل، شما باید از الگوریتمهای قوی و پویایی مثل bcrypt یا Argon2 استفاده کنید.
پیاچپی با معرفی تابعهای پیشرفتهی password_hash() و password_verify()، فرآیند رمزنگاری و اعتبارسنجی را به سادهترین شکل و در عین حال با بالاترین استانداردهای امنیتی فراهم کرده است.
تابع password_hash چیست؟ (پیشنیاز بررسی رمز)
قبل از اینکه بتوانیم رمزی را با password_verify() تایید کنیم، ابتدا باید آن را به صورت امن هش و در دیتابیس ذخیره کنیم. تابع password_hash() این کار را به همراه تولید خودکار یک نمک (Salt) تصادفی و منحصربهفرد برای هر پسورد انجام میدهد.
// تعریف رمز عبور کاربر در مرحله ثبتنام
$userPassword = "MySafePassword123";
// هش کردن رمز عبور با استفاده از الگوریتم ایمن BCRYPT
$hashedPassword = password_hash($userPassword, PASSWORD_DEFAULT);
// خروجی یک رشته امن ۶۰ کاراکتری خواهد بود که باید در دیتابیس ذخیره شود
echo $hashedPassword;
آشنایی با تابع password_verify در PHP
وقتی کاربر تلاش میکند وارد حساب خود شود، رمز عبور خام خود را در فرم لاگین وارد میسازد. در این مرحله، ما نباید رمز ورودی را مجدداً با تابع password_hash هش کنیم و با هش قبلی مقایسه کنیم؛ چرا که الگوریتمهای مدرن در هر بار اجرا، هش کاملاً متفاوتی به دلیل وجود Salt تصادفی تولید میکنند.
به جای این کار، پیاچپی تابع شگفتانگیز password_verify() را در اختیار ما قرار داده است. این تابع به صورت خودکار Salt و الگوریتم استفاده شده را از دل هش ذخیره شده بیرون میکشد، رمز خام ورودی را با آن پردازش میکند و نتیجه مطابقت را به صورت یک مقدار Boolean (true یا false) بازمیگرداند.
ساختار نحوی (Syntax) تابع
password_verify(string $password, string $hash): bool
- $password: رمز عبور خام که کاربر در فرم لاگین وارد کرده است.
- $hash: رشته هش شدهای که در دیتابیس ذخیره شده بود.
- خروجی: اگر مطابقت داشت
trueو در غیر این صورتfalseبرمیگرداند.
پیادهسازی عملی سیستم تایید رمز عبور در PHP
در نمونه کد زیر، یک سناریوی واقعی از نحوه بررسی اطلاعات کاربر و اعتبارسنجی پسورد در یک وبسایت واقعی را مشاهده میکنید:
// فرضیه: اطلاعاتی که کاربر در فرم ورود وارد کرده است
$emailInput = "user@example.com";
$passwordInput = "MySafePassword123";
// ۱. اتصال به دیتابیس و پیدا کردن کاربر بر اساس ایمیل (کد فرضی)
// $user = $db--->findUserByEmail($emailInput);
// فرض میکنیم هش ذخیره شده در دیتابیس برای این کاربر به شکل زیر است:
$dbHashedPassword = '$2y$10$8u4nKkR8gXm6Jq2Wf4sY1.9wz3pY4x9u8u8u8u8u8u8u8u8u8u8u8u';
// ۲. بررسی صحت رمز عبور وارد شده
if (password_verify($passwordInput, $dbHashedPassword)) {
echo "ورود با موفقیت انجام شد! به سیستم خوش آمدید.";
// در این بخش میتوانید سشن کاربر را فعال کنید
session_start();
$_SESSION['user_logged_in'] = true;
} else {
echo "خطا! نام کاربری یا رمز عبور اشتباه است.";
}
نکات طلایی گوگل برای ارتقای امنیت رمزها در PHP
طبق داکیومنتهای توسعهدهندگان گوگل، برای داشتن یک احراز هویت بینقص باید موارد زیر را رعایت کنید:
- هرگز از الگوریتمهای منسوخ استفاده نکنید: توابعی مثل
md5()،sha1()وcrypt()بدون Salt دستی به راحتی قابل شکستن هستند. - استفاده از الگوریتمهای قویتر: ثابت
PASSWORD_DEFAULTبه مرور زمان با پیشرفت امنیت PHP به الگوریتمهای قویتر آپدیت میشود. همچنین میتوانید به صورت مستقیم ازPASSWORD_ARGON2IیاPASSWORD_ARGON2IDاستفاده کنید. - طول فیلد دیتابیس: همواره ستون رمز عبور در دیتابیس خود را حداقل با طول ۲۵۵ کاراکتر (VARCHAR) در نظر بگیرید تا در صورت تغییر الگوریتمهای هش در آینده و بزرگتر شدن هشها، دادهها بریده نشوند.
پرسش و پاسخ
نظری یافت نشد
برای ارسال نظر ابتدا وارد شوید