Allora, sha1() per la sicurezza ha lo stesso esito di md5(), ovvero non usarlo.
Poi ovvio dipende da cosa devi fare, e quale potrebbe essere il target finale del tuo sito, ma parlando di best practice costa nulla usare sha1() o hash( 'sha256', ... ) o superiore.
All fine ti ritrovi un prodotto con una sicurezza intrinseca superiore, poi ovvio che se la password è quella dell'agente segreto Panariello, il codificarla a 16/32/64/128/256/enne byte di roba non conta nulla.
Per prima cosa una password deve essere lunga almeno 8 caratteri per stare ragionevolmente sicuri per un bel pezzo, poi ovvio anche qui dovrebbe comunque essere non presente nei dizionari.
Ci sono molte routine in giro che permettono di generare password a caratteri casuali, io ne uso una mia molto semplice ma comunque valida.
Codice PHP:
/** * Genera un numero unico da usarsi per password e salt.
* $length = numero di caratteri da usarsi in uscita.
*/
function makeUnique ( $length=16 ) {
$salt = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$len = strlen( $salt );
$makepass = '';
mt_srand( 10000000 * (double)microtime() );
for ( $i = 0; $i < $length; $i++ ) {
$makepass .= $salt[mt_rand( 0, $len - 1 )];
}
return $makepass;
} // makeUnique()
Ovviamente l'utente poi la cambia in Panariello style
Quello che faccio in realtà è sempre inviare la password in formato hash e in particolare uso sha512 per fare questo uso ( http://pajhome.org.uk/crypt/md5/ ) un file che trovo su quel sito e che è sha512.js ( ce ne sono altri, anche in md5 ) ho scelto di usare sha512 perché... non lo so mi piaceva
Dopo tutto come dicevo prima, usare un hash più semplice non ha senso quindi preferisco giocare duro.
Quindi nel database in realtà non metto l'hash della password ma l'hash dell'hash della password più il salt e quindi faccio una cosa del tipo:
Codice PHP:
$salt =hash( 'sha512', makeUnique( 64 ));
$password = hash( 'sha512', $_POST['pass'] . $salt );
Dove $_POST['pass'] contiene già l'hash a sha512 proveniente dal form di login.
Parlando di iscrizione, ovviamente dopo aver generata una password casuale da inviare all'email dell'iscritto, faccio quel lavoro, solo che prima di fare $salt e $password, cioè al posto di $_POST['pass'] se $pass = makeUnique( 10 ); ( password in chiaro da inviare via email ) poi $hashPass = hash( 'sha512', $pass );ovvero:
Codice PHP:
$pass = makeUnique( 10 );
$hashPass = hash( 'sha512', $pass );
$salt =hash( 'sha512', makeUnique( 64 ));
$password = hash( 'sha512', $hashPass . $salt );
Complicato? Giusto un filino
Ma nemmeno tanto se segui la logica scopri che è semplice.