⊗ppPmAuHFP 426 of 447 menu

Функцыя 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 { // карыстальніка з такім лагінам няма, вывядзем паведамленне } ?>

Перарабіце вашу аўтарызацыю і рэгістрацыю на новыя вывучаныя функцыі.

Беларуская
AfrikaansAzərbaycanБългарскиবাংলাČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Мы выкарыстоўваем cookie для працы сайта, аналітыкі і персаналізацыі. Апрацоўка дадзеных адбываецца згодна Палітыкай канфідэнцыяльнасці.
прыняць усе наладзіць адхіліць