[PHP] Szyfrowanie hasła

Artykuł został zaktualizowany 16/05/2020.

Aby zaszyfrować hasło w PHP można użyć jednej z kilku funkcji haszujących. Najpopularniejszymi funkcjami haszującymi są md5, sha1 i crypt. Jednak te dwie pierwsze nie są rekomendowane jako bezpieczne metody haszowania. Do bezpiecznego haszowania haseł należy używać funkcji password_hash.

Haszowanie przy użyciu password_hash

$password = 'hasło';
echo password_hash($password, PASSWORD_DEFAULT); // wyświetli hash bcrypt hasła $password

Haszowanie przy użyciu md5

$password = '12345';
echo md5($password); // Wyświetli '827ccb0eea8a706c4c34a16891f84e7b'

Haszowanie przy użyciu sha1

$password = '12345';
echo sha1($password); // Wyświetli '8CB2237D0679CA88DB6464EAC60DA96345513964'

Haszowanie przy użyciu crypt

$password = 'hasło';
echo crypt($password); // wyświetli hash crypt hasła $password z wygenerowaną automatycznie solą

Porównywanie haszy

Do porównania haszy wygenerowanych np. funkcją sha1 używa się funkcji hash_equals. Porownuje ona dwa ciągi hash zawsze w tym samym czasie niezależnie od tego czy są równe czy nie. Uwaga! Nigdy nie używaj operatora === do porównywania haszy.
Przykład:

$password_1 = sha1('12345');
$password_2 = sha1('12345');
$password_3 = sha1('1s4bod5');

hash_equals($password_1, $password_2); // Zwróci TRUE
hash_equals($password_1, $password_3); // Zwróci FALSE

Weryfikowanie hasła

Aby zweryfikować zgodność podanego hasła z haszem wygenerowanym przez funkcję password_hash należy użyć funkcji password_verify. Jest to funkcja stworzona właśnie do współpracy z password_hash. Próba użycia innej metody porównania się nie powiedzie, ponieważ funkcja password_hash za każdym razem generuje inną sól.
Przykład:

$hash = '$2y$12$RZksNLzUfNYKiLS4rXGaWeu0NlC0fnrrIHBm6RRdfl6/FunChELAG';
password_verify('123456', $hash); // Zwróci TRUE, jeśli hasło jest poprawne

Jak w praktyce wygląda szyfrowanie i weryfikacja haseł można zobaczyć w artykule skrypt rejestracji.

Komentarze

Popular

[HTML] Jak wstawić obrazek?

[PHP|HTML] Odświeżenie strony

[HTML] Jak wycentrować stronę?