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