E 'una buona idea usare il nome utente dell'utente come saltando l'hashing di una password come hash (username_str + password_str)?

4

Sto aiutando il mio amico con l'hashing delle sue password, e ho una domanda - Dovrebbe usare una stringa segreta come sale per l'hashing o è meglio avere ogni utente il proprio sale per l'hashing?

Considera questi tre hash:

hash("secretKey777" + password);
hash("secretKey777" + username + password);
hash(username + password);

Qual è il più difficile da decifrare e il più sicuro?

Penso che sia meglio usare hash("secretKey777" + username + password); perché per ogni utente non solo ha "secretKey777" come sale ma anche il suo nome utente. Nel caso in cui il codice cancella le perdite delle password, non ci sarà alcun attacco su tutti gli hash in una volta - ognuno avrà il suo sale unico.

    
posta bodacydo 11.10.2014 - 00:03
fonte

2 risposte

5

La caratteristica principale di un salt è che dovrebbe essere globalmente univoco per l'hash della password di ogni utente. Non è necessario che sia segreto, e un nome utente non soddisferà certamente i criteri richiesti di unicità. Una stringa segreta condivisa (utilizzata per tutti gli utenti) non è un salt, ma un pepe, e non è stato dimostrato che aggiunga sicurezza a password non salate e quindi non è un'opzione praticabile.

Una costruzione che ha la proprietà di essere particolarmente probabile che sia globalmente unica è costituita da dati casuali di lunghezza ragionevole. Il sale in realtà non ha bisogno di essere casuale, ma un valore casuale, generato individualmente per ogni utente ci dà la ragionevole certezza che abbiamo l'unicità di cui abbiamo bisogno.

C'è un po 'di più in questa risposta: Cosa dovrebbe essere usato come sale?

    
risposta data 11.10.2014 - 00:21
fonte
0

Should he use one secret string as salt

No. Un lato con codifica hard salt previene gli attacchi da tavolo arcobaleno precalcolati, ma al giorno d'oggi non sono davvero delle preoccupazioni importanti. Il vantaggio principale dell'uso di un salt casuale per ogni password hash è quello di un utente malintenzionato quando bruteforcing deve eseguire l'hash di ogni password con ogni salt, invece di eseguire l'hashing una volta sola e controllare tutte le password. Quindi rallenta l'attacco di un fattore pari al numero di utenti.

each user not only has "secretKey777" as a salt but also its own username

Non utilizzare nomi utente come hash. Non ha alcun impatto sulla sicurezza [*], ma ha un effetto sull'usabilità e sulla manutenibilità. Cosa succede se un utente vuole cambiare il suo nome utente? Questo non sarebbe possibile con il tuo approccio.

[*] tranne per il punto @Xander fatto. È un impatto, ma è piuttosto basso.

Quindi qual è l'approccio corretto?

hash(password+ generateRandomSalt());

E memorizzare il sale accanto a nome utente e password nel database. Puoi anche utilizzare una libreria che gestisce tutto questo per te (ad esempio se stai usando PHP, password_hash usa bcrypt e gestisce i sali per te).

    
risposta data 11.10.2014 - 19:42
fonte

Leggi altre domande sui tag