Funktsioon password_hash

Tegelikult loetakse funktsioon md5 ja parooli soolamine selle abiga vananenuks. Me õppisime seda selleks, et te mõistaksite edasist materjali, aga ka seetõttu, et võite sellega kokku puutuda töötades teiste projektidega.

On olemas täiuslikum viis soolatud parooli saamiseks. Selleks kasutatakse funktsiooni password_hash. Esimese parameetrina võtab see stringi ja teise parameetrina - krüpteerimisalgoritmi (sellest hiljem), ning tagastab selle stringi räsi koos soolaga.

Proovige mitu korda käivitada seda koodi:

html<?php
  echo password_hash('12345', PASSWORD_DEFAULT);
?>

Iga kord saate te erineva tulemuse ja selles tulemuses on stringi esimene osa sool ning teine osa - soolatud parool.

Oletame, et meil on funktsioonist password_hash saadud räsi ja mingi parool. Et kontrollida, kas see on selle parooli räsi või mitte, tuleks kasutada funktsiooni password_verify - esimese parameetrina võtab see parooli, ning teise parameetrina - räsi, ja tagastab true või false.

Vaatame näidet:

html<?php
  $password = '12345'; // parool
  $hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // räsi
  
  if (password_verify($password, $hash)) {
    // räsi sellelt paroolilt
  } else {
    // räsi pole sellelt paroolilt
  }
?>

Mida see meile praktikas annab: me ei pea looma andmebaasis eraldi välja soola salvestamiseks, ega muretsema soola genereerimise pärast - PHP teeb kõik meie eest!

See tähendab, et andmebaasis salvestame väljale password me soolatud parooli koos selle soolaga. Samal ajal on räsitud paroolil suurem pikkus. Seepärast peame andmebaasis paroolivälja pikkust muutma ja määrama selleks 60 tähemärki.

Nüüd parandame registreerimise koodi. Siin on see, mis on praegu:

html<?php
  function generateSalt()
  {
    $salt = '';
    $saltLength = 8; // soola pikkus
    
    for($i = 0; $i < $saltLength; $i++) {
      $salt .= chr(mt_rand(33, 126)); // sümbol ASCII-tabelist
    }
    
    return $salt;
  }
  
  $salt = generateSalt(); //  sool
  $password = md5($salt . $_POST['password']); // teisendame parooli soolatud räsiks
?>

Funktsiooni password_hash abil vähendame selle järgnevalt:

html<?php
  $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>

Samamoodi kohandatakse autoriseerimise kood:

html<?php
  $login = $_POST['login'];
  
  $query = "SELECT * FROM users WHERE login='$login'"; // saame kasutaja login-i järgi
  $res = mysqli_query($link, $query);
  $user = mysqli_fetch_assoc($res);
  
  if (!empty($user)) {
    $hash = $user['password']; // soolatud parool andmebaasist
    
    // Kontrollime, kas andmebaasist saadud räsi vastab sisestatud paroolile
    if (password_verify($_POST['password'], $hash)) {
      // kõik korras, autoriseerime...
    } else {
      // parool ei sobinud, kuvame teate
    }
  } else {
    // sellise loginiga kasutajat pole, kuvame teate
  }
?>
Задание 1

Muutke oma autoriseerimine ja registreerimine uute õpitud funktsioonide peale.