Функција 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-table
}
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 {
// нема корисник со таков логин, ќе испечатиме порака
}
?>
Преправете ја вашата авторизација и регистрација со новите изучени функции.