invece si, è quello il trick meraviglioso perché il salt viene memorizzato assieme all'hash, e riutilizzato automaticamente dalla funzione per controllare - però non va usata come ha fatto tu, ma come mostrato nell'esempio di php.net (sopra e qua riportato)
Codice PHP:
$password = crypt('mypassword'); // per ottenere l'hash
if (crypt($user_input, $password) == $password) {
echo "Password verified!";
}
Anche se i nomi dati alle variabili in questo esempio mi sembrano confusionari... riscriviamolo all'italiana
Codice PHP:
// prendi una password e la cripti con salt automatico, ottenendo un hash sempre diverso
$hash = crypt( $nuovapassword );
// che salvi da qualche parte (db o file)
// quando vuoi controllare se la password inserita dall'utente corrisponde, riusi crypt
if ( crypt($inserita, $hash) == $hash ) {
echo "Password corretta";
}
nota che nella seconda chiamata metti l'$hash nel parametro che dovrebbe contenere il salt! e questo è corretto, è il modo contorto in cui funziona questa (ehm) funzione. Schematizzando: - hash <= crypt ( password )
- crypt ( password, hash ) == hash s.se password è quella corretta
dove la seconda riga va intesa come: "se ricripto la password con lo stesso salt," -che è contenuto anch'esso in hash-, "ottengo lo stesso risultato?"
- Tecnicismi aggiunti, estremi ed addizionali:
la stringa restituita da crypt() è una mini struttura dati definita così:
Codice:
$<tipo-hash>$<salt>$<hash>
esempio: $1$9G1.cZ5.$IljQeucKr4ZSrCzrU7sne1
dove tipo-hash è un numero che indica quale funzione è stata usata per criptare la password (fra DES, md5, sha-1 et al.), salt sono i dati che sono stati aggiunti alla password prima di criptarla ed hash è il risultato della funzione chiamata.
Se il secondo parametro non viene specificato, il salt viene generato casualmente (sicurezza estrema!). Se il secondo parametro è una struttura del tipo sopra, il salt viene recuperato dall'apposita sezione della stringa.