Kazi ya password_hash
Kwa kweli kazi md5 na kuongeza chumvi
kwenye nywila kwa kuitumia inachukuliwa kuwa ya zamani.
Tuliifunza, ili mwelewe mafunzo
yaliyofuata, na pia kwa sababu mnaweza kukutana nayo
wakati mnakiprojeki cha mtu mwingine.
Kuna njia bora zaidi ya kupata
nywila iliyochungiwa na chumvi. Kwa hili hutumiwa kazi
password_hash. Parameta ya kwanza inakubali
mfumo wa maneno, na ya pili - algoriti ya usimbaji fiche
(kuhusu hili baadaye), na hurudisha hash ya mfumo huo wa maneno
pamoja na chumvi.
Jaribu kuendesha msimbo huu mara kadhaa:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Kila mara utapata matokeo tofauti na katika matokeo hayo sehemu ya kwanza ya mfumo wa maneno itakuwa ni chumvi, na sehemu ya pili - nywila iliyochungiwa na chumvi.
Wacha tuseme tuna hash, iliyopatikana kutoka kwa kazi
password_hash na nywila fulani. Ili
kuthibitisha, kama hii ni hash ya nywila hizi au la,
inapaswa kutumika kazi password_verify
- parameta ya kwanza inakubali nywila,
na ya pili - hash, na hurudisha true
au false.
Wacha tuangalie kwa mfano:
<?php
$password = '12345'; // nywila
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// hash kutoka kwa nywila hizi
} else {
// hash si kutoka kwa nywila hizi
}
?>
Hii inatupa nini kwa vitendo: tunaweza kutounda uwanja tofauti katika hifadhidata ya kuhifadhia chumvi, kujisumbua na kutengeneza chumvi hiyo - PHP itafanya yote kwa ajili yetu!
Yaani itatokea, kwamba katika hifadhidata ya katika uwanja
password tutahifadhi nywila iliyochungiwa
na chumvi pamoja na chumvi yake. Wakati huo huo nywila iliyohashwa
itakuwa na urefu mkubwa. Kwa hiyo
katika hifadhidata ya tunahitabu kusahihisha ukubwa
wa uwanja wa nywila na uweke kuwa 60
herufi.
Sasa wacha tusahihishe msimbo wa usajili. Hayo ni yale yaliyopo kwa sasa:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // urefu wa chumvi
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // ishara kutoka kwa jedwali la ASCII
}
return $salt;
}
$salt = generateSalt(); // chumvi
$password = md5($salt . $_POST['password']); // tubadilishe nywila kuwa hash iliyochungiwa
?>
Kwa kutumia password_hash tutaifupisha hii hadi:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Vivyo hivyo msimbo wa uthibitishaji utarekebishwa:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // tunapata mtumiaji kwa jina la kutumia
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // nywila iliyochungiwa kutoka kwa Hifadhidata
// Tunaangalia uthabiti wa hash kutoka kwa hifadhidata ya na nywila iliyowekwa
if (password_verify($_POST['password'], $hash)) {
// yote sawa, tuthibitishe...
} else {
// nywila haikukubaliana, tuonyeshe ujumbe
}
} else {
// hakuna mtumiaji na jina la kutumia kama hilo, tuonyeshe ujumbe
}
?>
Rekebisha uthibitishaji wako wa kutambulishwa na usajili kwa kazi mpya zilizosomwa.