Ci sono un sacco di ottimi post sulla sicurezza delle password nei database sullo stack overflow e su altri siti e, visto che sono completamente nuovo, ho passato parecchie ore a cercare di saperne di più su di esso negli ultimi giorni. Tuttavia, ci sono così tanti suggerimenti e best practice diversi che mi sono ancora molto confuso ...
Inoltre, ci sono ancora molti post più vecchi del 2007-2010, ecc. Come ho visto quanto velocemente cambiano le cose, non sono sicuro che sia ancora usuale usarlo come suggeriscono. Quindi, volevo sintetizzare ciò che ho trovato nei post e poi chiedere se questo metodo che ho trovato fosse una buona pratica ...
Quindi, questa non è una guida, ma un riassunto, so che è molto semplice e se ci sono errori per favore correggimi!
- Solo per menzionare: non si dovrebbero mai memorizzare password in testo semplice:)
- Le password di hash "a senso unico", in modo che nessuno possa mai vedere il testo normale. Quando l'utente inserisce la password, la si agisce allo stesso modo e la si confronta con il passaggio hash nel database.
- Oltre all'hash una password, dovresti saltarla. Aggiungete il sale alla stringa di password semplice e cancellate la nuova stringa. Se la password semplice è debole, l'aggiunta di sale lo rende più lungo e più strong.
- Il sale dovrebbe inoltre essere casuale (ho letto che il termine "sale" significa che è comunque casuale, altrimenti è stato chiamato "chiave"?). Questo serve a prevenire gli attacchi della tabella arcobaleno, perché l'utente malintenzionato dovrebbe creare una tabella per ogni sale che è molto più costoso in termini di tempo ecc. Inoltre, se due utenti hanno la stessa password non la riconoscerai se utilizzi sali casuali.
- Il sale non è un segreto! Viene memorizzato nel database accanto alla password con hash. Tuttavia, potrebbe non essere la migliore idea usare un timestamp, l'indirizzo e-mail dell'utente o qualsiasi altra cosa collegata all'utente come un sale casuale. Come ragione, ad es. menzionato che gli utenti tendono a utilizzare le stesse password su più siti / servizi. Quindi, il sale dovrebbe essere una stringa casuale, ho letto meglio sarebbe 64-bit?
- Il prossimo passo consiste nell'aggiungere iterazione al processo di hashing (1000 o più cicli), quindi il sale viene aggiunto alla password e viene quindi sottoposto a hashing più e più volte, il che significa solo una frazione di secondo per l'utente attendi quando accedi, ma riassume se hai un po 'di 10.000 voci nel tuo DB.
- Potrebbe essere un leggero vantaggio, se aggiungi una chiave del sito, memorizzata ad es. come una varietà globale oltre al sale. Tuttavia, dovresti sempre supporre che gli hacker abbiano anche accesso al tuo file system.
- Algoritmi di hash: ho trovato di sicuro che non è più sicuro usare MD5, SHA1 e altri metodi deboli ...
Quindi ci sono opinioni diverse su come usare SHA256, SHA512? Dovresti usare hash_hmac? Alcuni dicono di sì: ( link ) alcuni dicono usare le librerie è l'unico modo sicuro ... e poi una o due volte in un post ho letto di non usare le librerie come bcrypt o bubble fish ??
È davvero necessario utilizzare una libreria o è ad es. un metodo come questo abbastanza:
function hash_password($password, $nonce) {
for ($i = 0; $i < 5000; $i++) {
$hashed_pass = hash_hmac('sha512', $hashed_pass . $nonce . $password, $site_key);
}
return $hashed_pass;
}
Molte persone dicono che non inventano il tuo algo, quindi sono un po 'spaventato solo per usare qualcosa che si è auto-inventato.
Posso immaginare che sia difficile da prevedere, ma per quanto tempo un metodo può essere considerato abbastanza sicuro?
AGGIORNAMENTO: Quindi, grazie per tutti i vostri ottimi feedback. Manca un punto principale, come ho visto e molti di voi hanno detto: sicurezza della password, il che significa che una password complessa è fondamentale. Penso di aver ricevuto il messaggio, grazie ancora! :)
UPDATE 2: Solo per il completamento, ho trovato il seguente codice su link che uso per generare un salt casuale:
function rand_string( $length ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!§$%&/().-:;_#+*[]{}=";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
$str .= $chars[ rand( 0, $size - 1 ) ];
}
return $str;
}
$random_salt= rand_string(20);