password_hash funksiyasi
Aslida md5 funksiyasi va uning yordamida
parolni tuzlash eskirgan hisoblanadi.
Biz uni keyingi materialni tushunishingiz
uchun, shuningdek, boshqarning loyihalari
bilan ishlaganingizda duch kelishingiz mumkin
deb o'rgandik.
Tuzlangan parolni olishning yanada mukammal
usuli mavjud. Buning uchun password_hash
funksiyasi ishlatiladi. U birinchi parametr
sifatida satrni, ikkinchi parametr sifatida
shifrlash algoritmini (bu haqida keyinroq)
qabul qiladi va shu satrning tuz bilan
birgalikdagi xeshini qaytaradi.
Ushbu kodni bir necha marta ishga tushirib ko'ring:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Siz har safar boshqacha natija olasiz va bu natijada satrning birinchi qismi tuz, ikkinchi qismi esa tuzlangan parol bo'ladi.
Aytaylik, bizda password_hash
funksiyasidan olingan xesh va qandaydir
parol bor. Bu, shu parolning xeshi
yoki yo'qligini tekshirish uchun
password_verify funksiyasidan
foydalanish kerak - u birinchi parametr
sifatida parolni, ikkinchi parametr
sifatida xeshni qabul qiladi va
true yoki false
qaytaradi.
Keling, misolda ko'ramiz:
<?php
$password = '12345'; // parol
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // xesh
if (password_verify($password, $hash)) {
// shu parolning xeshi
} else {
// shu parolning xeshi emas
}
?>
Bu bizga amaliyotda nima beradi: biz ma'lumotlar bazasida tuzni saqlash uchun alohida maydon yaratishimiz shart emas, shu tuzni yaratish bilan bog'liq muammolarga o'zimiz duch kelishimiz shart emas - PHP hammasini o'zi qiladi!
Ya'ni, ma'lumotlar bazasidagi password
maydonida biz tuzlangan parolni uning tuzi
bilan birga saqlaymiz. Bunda xeshlangan
parol katta uzunlikka ega bo'ladi. Shuning
uchun ma'lumotlar bazasida parol maydonining
hajmini tuzatib, uni 60 belgiga
o'rnatishimiz kerak.
Endi keling, ro'yxatdan o'tish kodini tuzatamiz. Mavjud holatda mana bu:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // tuz uzunligi
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // ASCII-table dan belgi
}
return $salt;
}
$salt = generateSalt(); // tuz
$password = md5($salt . $_POST['password']); // parolni tuzlangan xeshga aylantiramiz
?>
password_hash yordamida biz buni shunday qisqartiramiz:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Xuddi shunday, autentifikatsiya kodi ham o'zgartiriladi:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // loginga ko'ra foydalanuvchini olamiz
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // Ma'lumotlar bazasidagi tuzlangan parol
// Bazadagi xesh va kiritilgan parolning mosligini tekshiramiz
if (password_verify($_POST['password'], $hash)) {
// hammasi yaxshi, autentifikatsiya qilamiz...
} else {
// parol mos kelmadi, xabar chiqaramiz
}
} else {
// bunday loginli foydalanuvchi yo'q, xabar chiqaramiz
}
?>
O'zingizning autentifikatsiya va ro'yxatdan o'tish tizimingizni yangi o'rganilgan funksiyalar asosida qayta yarating.