Metody zapisywania haseł w PHP

> Dodaj do ulubionych

PHP to skomplikowany j─Özyk o bardzo zawi┼éej historii, w kt├│rej by┼éo wiele wzlot├│w i upadk├│w. Wiele w nim niekonsekwencji i b┼é─Öd├│w i w ka┼╝dej kolejnej wersji pojawiaj─ů si─Ö nowe funkcje, niedoskona┼éo┼Ťci oraz dziwad┼éa, za kt├│rymi naprawd─Ö trudno nad─ů┼╝y─ç. Dlatego te┼╝ j─Özyk ten jest przez niekt├│rych kochany, a przez innych znienawidzony.

W serii artyku┼é├│w PHP. Najlepsze praktyki pr├│bujemy rozwi─ůza─ç niekt├│re najcz─Ö┼Ťciej spotykane problemy z j─Özykiem PHP. Potraktuj j─ů jak zbi├│r porad na temat najdziwniejszych i najbardziej nieprzyjaznych dla programisty element├│w j─Özyka. Artyku┼éy z tej serii w du┼╝ym stopniu bazuj─ů na zawarto┼Ťci strony phpbestpractices.org/ Aleksa Cabala.

Metody zapisywania haseł w PHP

Do obliczania skrótów i porównywania haseł używaj wbudowanych funkcji PHP.

Obliczanie skr├│t├│w (haszowanie, od ang. hashing) to standardowa metoda zabezpieczania hase┼é u┼╝ytkownik├│w przez zapisaniem ich w bazie danych. Niestety wiele algorytm├│w do obliczania skr├│t├│w, takich jak np. md5 czy nawet sha1, nie zapewnia wystarczaj─ůcego poziomu bezpiecze┼ästwa, poniewa┼╝ hakerzy potrafi─ů ┼éama─ç has┼éa zakodowane przy ich u┼╝yciu.

J─Özyk PHP ma wbudowan─ů bibliotek─Ö do obliczania skr├│t├│w hase┼é. Wykorzystano w niej algorytm bcrypt, kt├│ry jest aktualnie uwa┼╝any za najlepszy algorytm tego typu.

Przykład obliczania skrótów haseł w PHP

<?php
// Obliczenie skrótu hasła. Zmienna $hashedPassword będzie 60-znakowym łańcuchem.
$hashedPassword = password_hash('moje niesamowite hasło', PASSWORD_DEFAULT);
 
// Teraz mo┼╝na bezpiecznie zapisa─ç warto┼Ť─ç zmiennej $hashedPassword w bazie danych!
 
// Sprawdzenie czy użytkownik podał prawidłowe hasło przez porównanie tego, co wpisał z tym, co mamy zapisane w bazie danych.
password_verify('nieprawidłowe hasło', $hashedPassword); // false
 
password_verify('moje niesamowite hasło', $hashedPassword); // true
?>

Pułapki

  • W wielu poradnikach zaleca si─Ö jeszcze dodanie odrobiny ÔÇ×soliÔÇŁ do has┼éa, kt├│re ma zosta─ç poddane procesowi ÔÇ×haszowaniaÔÇŁ. To ┼Ťwietny pomys┼é, ale nie musisz tego robi─ç, je┼Ťli korzystasz z funkcji password_hash(), poniewa┼╝ dodaje ona s├│l automatycznie.

Uwagi na temat PHP <= 5.3.10

Do generowania i por├│wnywania skr├│t├│w u┼╝ywaj biblioteki phpass.

Przetestowano przy u┼╝yciu phpass 0.3.

Wbudowana w PHP biblioteka do obliczania skr├│t├│w hase┼é jest niedost─Öpna w wersji j─Özyka instalowanej w Ubuntu 12.04. Zamiast niej mo┼╝na jednak u┼╝ywa─ç otwartej biblioteki phpass o podobnej funkcjonalno┼Ťci w postaci ┼éatwej w u┼╝yciu klasy.

Przykład

<?php
// do┼é─ůczenie biblioteki phpass
require_once('phpass-0.3/PasswordHash.php');
 
// inicjalizacja mechanizmu obliczania skr├│t├│w bez przeno┼Ťnych skr├│t├│w (jest to bezpieczniejsze rozwi─ůzanie)
$hasher = new PasswordHash(8, false);
 
// obliczanie skrótu hasła,  $hashedPassword będzie 60-znakowym łańcuchem.
$hashedPassword = $hasher->HashPassword('moje niesamowite hasło');
 
// zapisanie warto┼Ťci zmiennej $hashedPassword w bazie danych
 
// sprawdzenie czy użytkownik podał prawidłowe hasło przez porównanie tego, co wpisał z tym, co mamy w bazie danych
$hasher->CheckPassword('nieprawidłowe hasło', $hashedPassword); // false
 
$hasher->CheckPassword('moje niesamowite hasło', $hashedPassword); // true
?>

Pułapki

  • Biblioteka phpass, podobnie jak funkcja password_hash() w nowszych wersjach PHP, automatycznie dodaje s├│l do has┼éa.

Autor: Alex Cabal

Źródło: http://phpbestpractices.org/

Tłumaczenie: Łukasz Piwko

Tre┼Ť─ç tej strony jest dost─Öpna na zasadach licencji CC BY-SA 3.0