Hașurarea parolei
Pentru a gestiona securitatea utilizatorilor noștri, nu stocăm niciodată parolele lor în format text simplu, ci stocăm în schimb hash-ul parolei. Hashing-ul nu este o operațiune reversibilă, parola nu poate fi recuperată. Totuși, parola poate fi spartă, iar pentru a face spargerea cât mai dificilă trebuie să folosim un algoritm sigur. Clasa Nette\Security\Passwords ne va ajuta în acest sens.
Cadrul adaugă automat un serviciu Nette\Security\Passwords
la containerul DI sub numele
security.passwords
, pe care îl obțineți trecându-l folosind injecția de dependență:
use Nette\Security\Passwords;
class Foo
{
public function __construct(
private Passwords $passwords,
) {
}
}
__construct($algo=PASSWORD_DEFAULT, array $options=[]): string
Alege ce algoritm securizat este utilizat pentru hashing și cum să îl configureze.
Valoarea implicită este PASSWORD_DEFAULT
, astfel încât alegerea algoritmului este lăsată la latitudinea PHP.
Algoritmul se poate schimba în versiunile mai noi ale PHP atunci când sunt suportați algoritmi de hashing mai noi și mai
puternici. Prin urmare, trebuie să știți că lungimea hash-ului rezultat se poate schimba. Prin urmare, ar trebui să stocați
hash-ul rezultat într-un mod care poate stoca suficiente caractere, 255 este lățimea recomandată.
Acesta este modul în care ați utiliza algoritmul bcrypt și ați modifica viteza de hashing folosind parametrul cost de la valoarea implicită 10. În anul 2020, cu costul 10, hashing-ul unei parole durează aproximativ 80ms, costul 11 durează 160ms, costul 12 apoi 320ms, scara este logaritmică. Cu cât este mai lent, cu atât mai bine, costul 10–12 este considerat suficient de lent pentru majoritatea cazurilor de utilizare:
// vom hash parolele cu 2^12 (2^cost) iterații ale algoritmului bcrypt.
$passwords = new Passwords(PASSWORD_BCRYPT, ['cost' => 12]);
Cu injecție de dependență:
services:
security.passwords: Nette\Security\Passwords(::PASSWORD_BCRYPT, [cost: 12])
hash(string $passwords): string
Generează hash-ul parolei.
$res = $passwords->hash($password); // Hașura parola
Rezultatul $res
este un șir de caractere care, pe lângă hash-ul propriu-zis, conține identificatorul
algoritmului utilizat, setările acestuia și sarea criptografică (date aleatorii pentru a se asigura că pentru aceeași parolă
se generează un hash diferit). Prin urmare, este compatibil cu versiunile anterioare, de exemplu, dacă se schimbă parametrii,
pot fi verificate hash-urile stocate folosind setările anterioare. Întregul rezultat este stocat în baza de date, deci nu este
nevoie să stocați separat sarea sau setările.
verify(string $password, string $hash): bool
Află dacă parola dată se potrivește cu hash-ul dat. Obține $hash
din baza de date după numele de utilizator
sau adresa de e-mail.
if ($passwords->verify($password, $hash)) {
// Parola corectă
}
needsRehash(string $hash): bool
Află dacă hash-ul se potrivește cu opțiunile date în constructor.
Utilizați această metodă atunci când, de exemplu, schimbați parametrii de hashing. Verificarea parolei va utiliza
parametrii stocați împreună cu hash-ul și dacă needsRehash()
returnează true, trebuie să calculați din nou
hash-ul, de data aceasta cu parametrii actualizați, și să îl stocați din nou în baza de date. Acest lucru asigură faptul
că hash-urile parolelor vor fi „actualizate“ automat atunci când utilizatorii se conectează.
if ($passwords->needsRehash($hash)) {
$hash = $passwords->hash($password);
// stochează $hash în baza de date
}