Nette Documentation Preview

syntax
Hașurarea parolei
*****************

.[perex]
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 [api:Nette\Security\Passwords] ne va ajuta în acest sens.

→ [Instalare și cerințe |@home#Installation]

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ță |dependency-injection:passing-dependencies]:

```php
use Nette\Security\Passwords;

class Foo
{
	public function __construct(
		private Passwords $passwords,
	) {
	}
}
```


__construct($algo=PASSWORD_DEFAULT, array $options=[]): string .[method]
========================================================================

Alege ce [algoritm securizat |https://www.php.net/manual/en/password.constants.php] 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:

```php
// 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ță:
```neon
services:
	security.passwords: Nette\Security\Passwords(::PASSWORD_BCRYPT, [cost: 12])
```


hash(string $passwords): string .[method]
=========================================

Generează hash-ul parolei.

```php
$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 .[method]
======================================================

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.

```php
if ($passwords->verify($password, $hash)) {
	// Parola corectă
}
```


needsRehash(string $hash): bool .[method]
=========================================

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ă.

```php
if ($passwords->needsRehash($hash)) {
	$hash = $passwords->hash($password);
	// stochează $hash în baza de date
}
```

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.

Instalare și cerințe

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
}