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
}
verzió: 4.0