Dodawanie soli do rejestracji
A więc, już wiesz, że hashowanie przez
md5 - jest procesem nieodwracalnym i haker,
który uzyskał dostęp do hasha, nie będzie mógł uzyskać
z tego hasha hasła.
W rzeczywistości to stwierdzenie nie jest całkowicie poprawne - obecnie źli hakerzy stworzyli biblioteki hashów popularnych i mniej popularnych haseł i każdy głupek może odgadnąć hasło, po prostu wyszukując jego hash.
Mowa o wystarczająco prostych, popularnych hasłach.
Wyszukaj na przykład hash 827ccb0eea8a706c4c34a16891f84e7b
i od razu w wyszukiwarce Google zobaczysz, że to
hasło '12345'.
Hashów wystarczająco skomplikowanych haseł w ten sposób nie odgadniesz (spróbuj).
Możesz spytać, w czym w takim razie problem - niech wszyscy będziemy rejestrować się ze skomplikowanymi hasłami. Jest jednak problem - większość użytkowników nie myśli o bezpieczeństwie swoich danych i może wprowadzać wystarczająco proste hasła.
Możemy przy rejestracji zmuszać do wymyślania
dłuższych haseł, ograniczając, na przykład,
minimalną liczbę znaków do 6
lub 8, jednakże i tak będą pojawiać się
hasła typu '123456' lub '12345678'.
Można, oczywiście, wymyślić bardziej inteligentny algorytm sprawdzania złożoności hasła, ale jest inne rozwiązanie.
Istota tego rozwiązania jest taka: hasła trzeba posolić. Sól - to specjalny losowy ciąg znaków, który będzie dodawany do hasła przy rejestracji i hash będzie obliczany nie od prostego hasła, a od ciągu sól+hasło, to znaczy od solonego hasła.
To znaczy przy rejestracji będziesz robić coś takiego:
<?php
$salt = '1sJg3hfdf'; // sól - skomplikowany losowy ciąg znaków
$password = md5($salt . $_POST['password']); // przekształcamy hasło w solony hash
?>
Przy czym sól będzie inna dla każdego użytkownika, trzeba ją będzie generować w sposób losowy w momencie rejestracji.
Oto gotowa funkcja, która to zrobi:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // długość soli
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // znak z ASCII-table
}
return $salt;
}
?>
Za pomocą tej funkcji można przepisać nasz kod w ten sposób:
<?php
$salt = generateSalt(); // sól
$password = md5($salt . $_POST['password']); // solone hasło
?>
Jeszcze raz powtórzę, że to były zmiany przy rejestracji - w bazie danych zapisujemy nie po prostu hash hasła, a hash solonego hasła.
To jeszcze nie wszystko: w tabeli z użytkownikami oprócz
pól login i password trzeba
zrobić jeszcze pole salt, w którym
będziemy przechowywać sól każdego użytkownika.
Zaimplementuj opisaną powyżej rejestrację z solonym hasłem.