Adăugarea sării în înregistrare
Așadar, știți deja că hash-ul prin
md5 este un proces ireversibil și un hacker,
care a obținut acces la hash, nu va putea obține
parola din acest hash.
De fapt, această afirmație nu este pe deplin corectă - în prezent, hackerii răi au compilat biblioteci de hash-uri pentru parole populare și mai puțin populare, iar orice prost le poate descifra, pur și simplu căutând hash-ul pe Google.
Vorbim despre parole suficient de simple și populare.
Căutați, de exemplu, hash-ul 827ccb0eea8a706c4c34a16891f84e7b
și veți vedea imediat în rezultatele căutării Google că acesta este
parola '12345'.
Hash-urile parolelor suficient de complexe nu pot fi descifrate în acest fel (încercați).
Ați putea întreba, care este atunci problema - haideți să ne înregistrăm cu toții cu parole complexe. Există, totuși, o problemă - majoritatea utilizatorilor nu se gândesc la securitatea datelor lor și pot introduce parole suficient de simple.
Putem la înregistrare să forțăm utilizatorii să folosească
parole mai lungi, limitând, de exemplu,
numărul minim de caractere la 6
sau 8, dar totuși vor apărea
parole de genul '123456' sau '12345678'.
Desigur, putem concepe un algoritm mai inteligent pentru a verifica complexitatea parolei, dar există o altă soluție.
Esența acestei soluții este următoarea: parolele trebuie sărate. Sarea - este un șir special aleatoriu, care va fi adăugat la parolă la înregistrare, iar hash-ul va fi calculat nu de la parola simplă, ci de la șirul sara+parola, adică de la parola sărată.
Adică la înregistrare veți face ceva de genul:
<?php
$salt = '1sJg3hfdf'; // sarea - un șir aleatoriu complex
$password = md5($salt . $_POST['password']); // transformăm parola în hash sărat
?>
În acest caz, sarea va fi diferită pentru fiecare utilizator, ea trebuie generată aleatoriu în momentul înregistrării.
Iată o funcție gata făcută care face asta:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // lungimea sării
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // caracter din ASCII-table
}
return $salt;
}
?>
Cu ajutorul acestei funcții putem rescrie codul nostru așa:
<?php
$salt = generateSalt(); // sarea
$password = md5($salt . $_POST['password']); // parola sărată
?>
Repet, acestea au fost modificări făcute la înregistrare - în baza de date salvăm nu doar hash-ul parolei, ci hash-ul parolei sărate.
Nu este tot: în tabela cu utilizatori, pe lângă
câmpurile login și password, trebuie
să existe și un câmp salt, în care
vom stoca sarea fiecărui utilizator.
Implementați înregistrarea descrisă mai sus cu parola sărată.