Aggiunta del salt alla registrazione
Dunque, sai già che l'hash tramite
md5 è un processo irreversibile e un hacker,
che ottiene l'hash, non potrà ricavare
la password da questo hash.
In realtà questa affermazione non è del tutto vera - attualmente hacker malintenzionati hanno creato librerie di hash di password popolari e non e qualsiasi sciocco può decifrare la password, semplicemente cercando il suo hash su Google.
Si tratta di password abbastanza semplici e popolari.
Cerca su Google, ad esempio, l'hash 827ccb0eea8a706c4c34a16891f84e7b
e vedrai immediatamente nei risultati di Google, che è
la password '12345'.
Gli hash di password abbastanza complesse non possono essere decifrati in questo modo (provalo).
Potresti chiederti, qual è il problema allora - facciamo sì che tutti ci registriamo con password complesse. C'è, tuttavia, un problema - la maggior parte degli utenti non pensa alla sicurezza dei propri dati e potrebbe inserire password abbastanza semplici.
Possiamo obbligare a creare
password più lunghe durante la registrazione, limitando, ad esempio,
il numero minimo di caratteri a 6
o 8, tuttavia, continueranno ad apparire
password come '123456' o '12345678'.
Si potrebbe, certamente, ideare un algoritmo più intelligente per verificare la complessità della password, ma c'è un'altra soluzione.
L'essenza di questa soluzione è questa: le password devono essere salenate. Il salt (sale) è una stringa casuale speciale, che verrà aggiunta alla password durante la registrazione e l'hash sarà calcolato non dalla semplice password, ma dalla stringa salt+password, cioè dalla password salata.
Cioè durante la registrazione farai qualcosa del genere:
<?php
$salt = '1sJg3hfdf'; // salt - stringa casuale complessa
$password = md5($salt . $_POST['password']); // convertiamo la password in un hash salato
?>
In questo caso il salt sarà diverso per ogni utente, deve essere generato in modo casuale al momento della registrazione.
Ecco una funzione pronta che lo farà:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // lunghezza del salt
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // carattere dalla ASCII-table
}
return $salt;
}
?>
Con questa funzione puoi riscrivere il nostro codice in questo modo:
<?php
$salt = generateSalt(); // salt
$password = md5($salt . $_POST['password']); // password salata
?>
Lo ripeto ancora, questi erano cambiamenti durante la registrazione - nel database salviamo non semplicemente l'hash della password, ma l'hash della password salata.
Non è tutto: nella tabella degli utenti oltre
ai campi login e password è necessario
avere anche un campo salt, in cui
conserveremo il salt di ogni utente.
Implementate la registrazione descritta sopra con la password salata.