password_hash функциясы
Чындыгында md5 функциясы жана анын жардамы менен
парольду туздоо эскирген деп эсептелет.
Биз аны кийинки материалды түшүнүшүңүз үчүн, ошондой эле өзгөчө долбоорлор менен иштегенде жолугушу мүмкүн болгондуктан үйрөндүк.
Туздалган пароль алуунун дагы бир жакшыраак жолу бар.
Бул үчүн password_hash функциясы колдонулат. Биринчи параметр катары ал
сапты кабыл алат, экинчиси - шифрлөө алгоритми
(аны кийинчерээк), жана ал саптын хэшин туз менен кошо кайтарат.
Бул кодду бир нече жолу иштетип көрүңүз:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Ар жолу сиз ар кандай натыйжа аласыз жана бул натыйжада саптын биринчи бөлүгү туз болот, ал эми экинчи бөлүгү - туздалган пароль.
password_hash функциясынан алынган хэш жана
кандайдыр бир пароль бар дейли.
Бул хэш ушул паролдун же эмес экенин текшерүү үчүн,
password_verify функциясын колдонуу керек
- биринчи параметр катары ал паролду кабыл алат,
экинчиси - хэшти, жана true
же false кайтарат.
Келгиле, мисалды карап көрөлү:
<?php
$password = '12345'; // пароль
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // хэш
if (password_verify($password, $hash)) {
// бул паролдун хэши
} else {
// бул паролдун хэши эмес
}
?>
Бул бизге практикада эмне берет: биз тузду сактоо үчүн маалымат базасында өзүнчө талаа түзүшпөйбүз, ушул тузду генерациялоо менен баш оорутпайбыз - PHP баарын биз үчүн жасайт!
Болгону, маалымат базасындагы
password талаасында биз туздалган
паролду анын тузу менен кошо сактайбыз. Бул учурда хэштелген
пароль чоңураак узундукка ээ болот. Ошондуктан
маалымат базасында пароль талаасынын өлчөмүн түзөтүп,
аны 60 символго коюубуз керек.
Эми катталуу кодун оңдоп көрөлү. Учурда бар болгон нерсе:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // туздун узундугу
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // ASCII-таблицадагы символ
}
return $salt;
}
$salt = generateSalt(); // туз
$password = md5($salt . $_POST['password']); // паролду туздалган хэшке айландырабыз
?>
password_hash жардамы менен биз муну төмөнкүчө кыскарта алабыз:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Ошо сыяктуу эле, кирүү коду да оңдолот:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // логин боюнча колдонуучуну алабыз
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // БЗден алынган туздалган пароль
// Базадагы хэш менен киргизилген паролдун дал келгенин текшеребиз
if (password_verify($_POST['password'], $hash)) {
// баары жакшы, киргизебиз...
} else {
// пароль туура келбей калды, билдирме чыгарабыз
}
} else {
// ушундай логиндеги колдонуучу жок, билдирме чыгарабыз
}
?>
Кирүү жана катталууңузду жаңы үйрөнүлгөн функцияларга ылайыкташтырыңыз.