تابع password_hash رمزنگاری امن در PHP
تابع password_hash – برای رمزنگاری امن در PHP راه های مختلفی وجود دارد اما توصیه وب سایت رسمی PHP استفاده از password_hash است .
که قابلیت منحصر به فردی که دارد این است که رمز هش شده الان با 1 ثانیه بعد فرق دارد .
تابع password_hash دارای 3 ورودی است 2 ورودی اول ( اجباری ) :
1- رمز عبور یا رشته ای که میخواهید hash شود
2- نوع الگوریتم hashing
3- تنظیمات متناسب با ورودی 2 ( آرایه )
ابتدا رمز عبور یا رشته را داخل متغیری با نام password ذخیره می کنیم :
$password = "rapidcode123456";
الگوریتم هش PASSWORD_BCRYPT
اولین مورد است و از نسخه 5.5 در دسترس است . خروجی هش شده ی آن 60 کاراکتر است .
آرگومان های قابل استفاده برای ورودی سوم متناسب با این تابع :
1- salt : اطلاعاتی که با password ادغام می شود باید 22 کاراکتر باشد ( از نسخه 7 به بعد منسوخ شده ! )
2- cost : میزان پردازش برای هش پسورد ( پیشفرض 10 ) توصیه می شود تغییر داده نشود هر چقدر عدد بالاتر باشد منابع سخت افزاری بیشتری به کار گرفته می شود .
$option = [ "cost" => "10" ]; echo password_hash($password , PASSWORD_BCRYPT , $option);
الگوریتم هش PASSWORD_ARGON2I
از نسخه 7.2.0 قابل دسترس است . خروجی هش شده ی PASSWORD_ARGON2I حدود 100 کاراکتر است .
آرگومان های قابل استفاده برای ورودی سوم متناسب با تابع PASSWORD_ARGON2I :
1- time_cost : حداکثر تعدادی که می تواند برای محاسبه هش پسورد داشته باشد . ( پیشفرض 2 )
2- memory_cost : حداکثر حافظه برای محاسبه هش پسورد ( پیشفرض 1024 )
3- threads : تعداد کانالی که از پردازشگری مرکزی سرور برای محاسبه هش پسورد به طور همزمان استفاده می کند ( پیشفرض 2 )
$option = [ "time_cost" => 5, "memory_cost" => 2048, "threads" => 4 ]; echo password_hash($password , PASSWORD_ARGON2I , $option);
الگوریتم هش PASSWORD_ARGON2ID
از نسخه 7.0.3 در دسترس است . مشابه الگوریتم قبلی اما دارای تفاوت در الگوریتم هش پسورد .
ورودی 3 هم همان آرگومان های PASSWORD_ARGON2I .
$option = [ "time_cost" => 3, "memory_cost" => 2048, "threads" => 6 ]; echo password_hash($password , PASSWORD_ARGON2ID , $option);
الگوریتم هش PASSWORD_DEFAULT
همانطور که از نامش پیداست از میان 3 الگوریتم اصلی hashing با توجه به کانفیگ سرور یکی را در نظر می گیرد که معمولا PASSWORD_BCRYPT است ، ورودی سوم با توجه به نوع الگورتیم هشینگ داده می شود .
echo password_hash($password , PASSWORD_DEFAULT);
چگونه پسورد غیر hash شده را با hash شده مقایسه کنیم ؟
از آن جایی که تابع password_hash در هر ثانیه تغیر می کند نمی توان از آن برای مقایسه استفاده کرد ، برای این موضوع تابعی وجود دارد به نام password_verify که دارای 2 ورودی (اجباری) است :
1- پسورد خام ( غیر هش شده )
2- پسورد هش شده
که پس از مقایسه در صورتی که پسورد با هش آن مطابقت داشت مقدار true و در غیر اینصورت false بازگردانده می شود .
$hashed_password = '$2y$10$hipD4rI3xER631IL.wJIAupFXOHGMN1C.KjotGIe/8HHVH7nnucoe'; if(password_verify($password , $hashed_password)){ echo "Login User (:"; }
لیست نظرات
سلام خدا قوت این نمکی که به پسورد اضافه میشه اگر اگر دو پیکرد رو برگردونه با مقایسه اونها با هم میتونه نمک رو تشخیص بده درسته ؟
درود ، بله تشخیص میده .