Password di hashing per l'archiviazione sicura (generazione di sale)

1

Volevo verificare se i seguenti mezzi per generare un hash per la memorizzazione di una password erano sicuri.

Ho un nome utente e una password combinati. Per generare un hash sicuro, faccio quanto segue:

gen_password = SHA256 (password + "my_site_name")

gen_salt = SHA256 (username + password + "my_site_name")

hash = PBKDF2 (gen_password, gen_salt, rounds)

Qualcuno vede punti deboli o problemi con questo approccio? Generare e archiviare un sale non è un'opzione, quindi spero che questo metodo possa funzionare.

Se qualcuno può offrire miglioramenti su questo, sarebbe fantastico!

Grazie.

    
posta user44821 16.04.2014 - 22:02
fonte

1 risposta

0

La debolezza del tuo sistema è intrinseca: non c'è un vero sale. Dai tuoi commenti, suppongo che tu non possa (per qualche ragione contestuale) immagazzinare un sale generato casualmente. Quindi ciò che fai equivale, in sostanza, a utilizzare la coppia "utente + sito" come salt.

I vari hash sono complessi e alcune parti sono inutili: non è necessario inserire la password in così tanti punti. Dovresti sforzarti per la semplicità; la complessità è il tuo nemico. Tuttavia, devi fare i conti con le idiosincrasie di PBKDF2 (se vuoi usare quella funzione), quindi il seguente dovrebbe essere il più sicuro possibile:

s = SHA-256(username + '|' + sitename)
p = SHA-256(password)
hash = PBKDF2(p, s, rounds)

Nota che uso un '|' carattere come separatore e presumo che tale carattere non compaia nel nome del sito (questo per evitare collisioni spurie). L'extra SHA-256 sulla password stessa serve solo per evitare un problema di PBKDF2, ovvero che diventa due volte più lento quando la lunghezza della password supera la lunghezza della funzione hash sottostante (64 byte per SHA-1 e SHA-256). Se sei sicuro che le tue password non supereranno mai i 64 byte, puoi rimuovere il secondo hash e usare "password" direttamente in PBKDF2.

Problema principale rimanente: se l'utente cambia la sua password, la nuova password e la vecchia password utilizzeranno lo stesso pseudo-sale. Se un utente malintenzionato può ottenere entrambi i valori hash, allora può provare a rompere entrambi per il costo di rompere solo uno. Un problema simile si verifica se si distrugge un account utente e quindi riutilizzare lo stesso nome utente. Non puoi evitare questo problema se non memorizzi un valore simile al sale (generato casualmente) insieme ai valori hash.

Miglioramenti: potresti voler modificare alcuni parametri. Ad esempio, se il tuo server è un PC (64-bit, o almeno un PC con SSE2 e usa OpenSSL per l'implementazione della funzione hash), potresti voler assicurarti che PBKDF2 si basi su SHA-512 invece di SHA-256 o SHA-1: SHA-512 sarà efficiente sul tuo PC ma renderà la vita più difficile per un utente malintenzionato con una GPU (le solite GPU sono meno constrongvoli con i tipi a 64 bit integer). Si consiglia inoltre di passare da PBKDF2 a Bcrypt, per i motivi esposti ci .

    
risposta data 16.04.2014 - 22:35
fonte

Leggi altre domande sui tag