Nette Documentation Preview

syntax
Jelszó zárolás
**************

.[perex]
Felhasználóink biztonsága érdekében soha nem tároljuk jelszavaikat egyszerű szöveges formátumban, helyette a jelszó kivonatát tároljuk. A kivonatolás nem reverzibilis művelet, a jelszó nem állítható vissza. A jelszó azonban feltörhető, és hogy a feltörést a lehető legnehezebbé tegyük, biztonságos algoritmust kell használnunk. A [api:Nette\Security\Passwords] osztály segít ebben.

→ [Telepítés és követelmények |@home#Installation]

A keretrendszer automatikusan hozzáad egy `Nette\Security\Passwords` szolgáltatást a DI konténerhez `security.passwords` néven, amelyet [függőségi injektálással |dependency-injection:passing-dependencies] átadva kapunk meg:

```php
use Nette\Security\Passwords;

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


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

Kiválasztja, hogy melyik [biztonságos algoritmust |https://www.php.net/manual/en/password.constants.php] használja a hashingoláshoz, és hogyan konfigurálja azt.

Az alapértelmezett a `PASSWORD_DEFAULT`, így az algoritmus kiválasztása a PHP-re marad. Az algoritmus változhat az újabb PHP-kiadásokban, amikor újabb, erősebb hashing algoritmusok támogatottak. Ezért tisztában kell lennie azzal, hogy a kapott hash hossza változhat. Ezért a kapott hash-t úgy kell tárolni, hogy elegendő karaktert tudjon tárolni, 255 az ajánlott szélesség.

Így használhatod a bcrypt algoritmust, és a hashelés sebességét a cost paraméter segítségével változtathatod meg az alapértelmezett 10-es értékről. A 2020-as évben, 10-es költséggel egy jelszó hashelése nagyjából 80 ms, 11-es költséggel 160 ms, 12-es költséggel pedig 320 ms, a skála logaritmikus. Minél lassabb, annál jobb, a 10-12-es költség a legtöbb felhasználási esethez elég lassúnak tekinthető:

```php
// a jelszavakat a bcrypt algoritmus 2^12 (2^költség) iterációjával fogjuk hash-olni.
$passwords = new Passwords(PASSWORD_BCRYPT, ['cost' => 12]);
```

Függőségi injektálással:
```neon
services:
	security.passwords: Nette\Security\Passwords(::PASSWORD_BCRYPT, [cost: 12])
```


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

Jelszó hash generálása.

```php
$res = $passwords->hash($password); // A jelszó mása
```

Az eredmény `$res` egy karakterlánc, amely a hash mellett tartalmazza a használt algoritmus azonosítóját, a beállításokat és a kriptográfiai sót (véletlenszerű adat, amely biztosítja, hogy ugyanarra a jelszóra más hash generálódjon). Ezért visszafelé kompatibilis, például ha megváltoztatja a paramétereket, a korábbi beállításokkal tárolt hash-ek ellenőrizhetők. Ez a teljes eredmény az adatbázisban tárolódik, így nincs szükség a só vagy a beállítások külön tárolására.


verify(string $password, string $hash): bool .[method]
======================================================

Kideríti, hogy a megadott jelszó megegyezik-e a megadott hash-val. A `$hash` adatbázisból a felhasználónév vagy az e-mail cím alapján.

```php
if ($passwords->verify($password, $hash)) {
	// Helyes jelszó
}
```


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

Kideríti, hogy a hash megegyezik-e a konstruktorban megadott beállításokkal.

Ezt a metódust akkor használjuk, ha például hashing paramétereket változtatunk. A jelszó ellenőrzése a hash-sel együtt tárolt paramétereket használja, és ha a `needsRehash()` true-t ad vissza, akkor újra ki kell számítani a hash-t, ezúttal a frissített paraméterekkel, és újra el kell tárolni az adatbázisban. Ez biztosítja, hogy a jelszavak hash-jei automatikusan "frissüljenek", amikor a felhasználók bejelentkeznek.

```php
if ($passwords->needsRehash($hash)) {
	$hash = $passwords->hash($password);
	// $hash tárolása az adatbázisban
}
```

Jelszó zárolás

Felhasználóink biztonsága érdekében soha nem tároljuk jelszavaikat egyszerű szöveges formátumban, helyette a jelszó kivonatát tároljuk. A kivonatolás nem reverzibilis művelet, a jelszó nem állítható vissza. A jelszó azonban feltörhető, és hogy a feltörést a lehető legnehezebbé tegyük, biztonságos algoritmust kell használnunk. A Nette\Security\Passwords osztály segít ebben.

Telepítés és követelmények

A keretrendszer automatikusan hozzáad egy Nette\Security\Passwords szolgáltatást a DI konténerhez security.passwords néven, amelyet függőségi injektálással átadva kapunk meg:

use Nette\Security\Passwords;

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

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

Kiválasztja, hogy melyik biztonságos algoritmust használja a hashingoláshoz, és hogyan konfigurálja azt.

Az alapértelmezett a PASSWORD_DEFAULT, így az algoritmus kiválasztása a PHP-re marad. Az algoritmus változhat az újabb PHP-kiadásokban, amikor újabb, erősebb hashing algoritmusok támogatottak. Ezért tisztában kell lennie azzal, hogy a kapott hash hossza változhat. Ezért a kapott hash-t úgy kell tárolni, hogy elegendő karaktert tudjon tárolni, 255 az ajánlott szélesség.

Így használhatod a bcrypt algoritmust, és a hashelés sebességét a cost paraméter segítségével változtathatod meg az alapértelmezett 10-es értékről. A 2020-as évben, 10-es költséggel egy jelszó hashelése nagyjából 80 ms, 11-es költséggel 160 ms, 12-es költséggel pedig 320 ms, a skála logaritmikus. Minél lassabb, annál jobb, a 10–12-es költség a legtöbb felhasználási esethez elég lassúnak tekinthető:

// a jelszavakat a bcrypt algoritmus 2^12 (2^költség) iterációjával fogjuk hash-olni.
$passwords = new Passwords(PASSWORD_BCRYPT, ['cost' => 12]);

Függőségi injektálással:

services:
	security.passwords: Nette\Security\Passwords(::PASSWORD_BCRYPT, [cost: 12])

hash(string $passwords): string

Jelszó hash generálása.

$res = $passwords->hash($password); // A jelszó mása

Az eredmény $res egy karakterlánc, amely a hash mellett tartalmazza a használt algoritmus azonosítóját, a beállításokat és a kriptográfiai sót (véletlenszerű adat, amely biztosítja, hogy ugyanarra a jelszóra más hash generálódjon). Ezért visszafelé kompatibilis, például ha megváltoztatja a paramétereket, a korábbi beállításokkal tárolt hash-ek ellenőrizhetők. Ez a teljes eredmény az adatbázisban tárolódik, így nincs szükség a só vagy a beállítások külön tárolására.

verify(string $password, string $hash)bool

Kideríti, hogy a megadott jelszó megegyezik-e a megadott hash-val. A $hash adatbázisból a felhasználónév vagy az e-mail cím alapján.

if ($passwords->verify($password, $hash)) {
	// Helyes jelszó
}

needsRehash(string $hash): bool

Kideríti, hogy a hash megegyezik-e a konstruktorban megadott beállításokkal.

Ezt a metódust akkor használjuk, ha például hashing paramétereket változtatunk. A jelszó ellenőrzése a hash-sel együtt tárolt paramétereket használja, és ha a needsRehash() true-t ad vissza, akkor újra ki kell számítani a hash-t, ezúttal a frissített paraméterekkel, és újra el kell tárolni az adatbázisban. Ez biztosítja, hogy a jelszavak hash-jei automatikusan „frissüljenek“, amikor a felhasználók bejelentkeznek.

if ($passwords->needsRehash($hash)) {
	$hash = $passwords->hash($password);
	// $hash tárolása az adatbázisban
}