Cercando di capire l'hashing della password

5

Sto cercando di comprendere l'hashing delle password. In passato sembrava così semplice, solo MD5 (password + sale) e il gioco è fatto. Quindi md5 ha dimostrato di avere collisioni così le persone hanno iniziato a passare a SHA1 e così via.

Poi abbiamo iniziato a parlare di dover creare lentezza, quindi abbiamo implementato molte iterazioni del nostro algoritmo di hash per rendere il controllo dell'hash abbastanza lento.

Quello che sto cercando di capire è:

  • Perché SHA512 non può essere utilizzato in un algoritmo di password se lo iteriamo abbastanza per crearlo lentamente? L'esempio è SHA512 la password 100k volte.
  • Perché è raccomandato PBKDF2 o bcrypt invece di fare quanto sopra? O perché no?

    Questa risposta afferma che è "non per l'hashing di una password per l'archiviazione sicura a fini di autenticazione". Tuttavia questa risposta (con molti upvotes) consiglia l'opposto (?); che dovresti usare pbkdf2 / bcrypt / scrypt per memorizzare in sicurezza le password.

  • Se una funzione PBKDF2 si basa su SHA1 sottostante, è intrinsecamente insicura se SHA1 può essere dimostrato danneggiato? ( Implementazione .NET RFC2898 )

Speriamo che se qualcuno possa rispondere alle domande di cui sopra comprenderò perché un semplice algoritmo di hash (a lenta lentezza) non è sufficiente, e anche perché abbiamo bisogno di tutte queste funzioni derivative chiave apparentemente complesse per fare una semplice memorizzazione delle password.

    
posta Chris Dale 25.07.2012 - 11:04
fonte

3 risposte

8

Then md5 was proven to have collisions so people started moving to SHA1 and so on.

Si noti che la resistenza alla collisione non è richiesta per l'hashing della password. Ancora non c'è motivo di usare un hash più debole del necessario.

Why can't SHA512 be used in a password algorithm if we iterate it enough to create it slow? Example is to SHA512 the password 100k times.

Puoi farlo. Finché si mischia password e sale già all'inizio dovrebbe essere sicuro.

Non lo consigliamo, perché non c'è motivo di inventare il tuo schema, quando ci sono molti schemi standard.

Why is PBKDF2 or bcrypt recommended instead of doing the above? Or why is it not?

Perché sono standardizzati e sono stati guardati da molti crittografi. In questo modo puoi essere più sicuro che non vi siano punti deboli nello schema rispetto al tuo schema ad hoc.

PBKDF2 è essenzialmente una funzione di hash iterata, che usa HMAC per mescolare la password e salt.

bcrypt è una costruzione diversa. È leggermente più difficile rompere quel PBKDF2, dal momento che richiede un po 'più di memoria (pochi kB), aumentando un po' il numero di porte richieste.

C'è anche uno schema chiamato scrypt che ha un parametro di memoria sintonizzabile, che consente di far consumare allo schema quantità significative di memoria (diversi megabyte o più). Ciò impedisce che l'hardware speciale sia molto più efficiente dell'hardware standard, dal momento che deve ancora acquistare molta RAM.
scrypt è probabilmente il più strong di questi schemi. Ma è relativamente nuovo e utilizza primitive non comuni, quindi molti utenti scelgono ancora schemi più vecchi.

This answer states that it is "not for hashing a password for safe storage for authentication purposes". However this answer (with many upvotes) recommends the opposite

Questa domanda riguarda una raccomandazione NIST esplicita per PBKDF2 con hashing della password. Vi è solo una raccomandazione per utilizzare PBKDF2 per la derivazione della chiave basata su password, una tecnica strettamente correlata. L'assenza di una raccomandazione NIST non implica che lo schema sia cattivo.

If a PBKDF2 function relies on SHA1 underneath, is it inherently insecure if SHA1 can be proven broken?

Se c'è un primo attacco pre-immagine contro SHA1, che funziona in base a determinati vincoli, allora sì, PBKDF2 con SHA1 è rotto. D'altra parte un attacco di collisione non è sufficiente. Un primo attacco pre-immagine è in genere molto più difficile di un attacco di collisione. Ad esempio non ne conosciamo nemmeno uno contro MD5.

    
risposta data 25.07.2012 - 11:56
fonte
8

Why can't SHA512 be used in a password algorithm if we iterate it enough to create it slow? Example is to SHA512 the password 100k times.

Non c'è alcuna ragione per cui questo non possa funzionare. Questo è essenzialmente ciò che PBKDF2 è.

Why is PBKDF2 or bcrypt recommended instead of doing the above? Or why is it not?

PBKDF2 sta essenzialmente prendendo un hash SHA e iterandolo più volte.

bcrypt, d'altro canto, utilizza l'algoritmo blowfish e richiede un maggiore accesso alla memoria, che non è molto efficiente su una GPU. Ciò rende più difficile per un utente malintenzionato con una GPU accelerare il processo di cracking. Questo è lo stesso di scrypt, per estensione.

If a PBKDF2 function relies on SHA1 underneath, is it inherently insecure if SHA1 can be proven broken?

Dalla mia comprensione, sì.

Il motivo per cui le persone suggeriscono di utilizzare le funzioni derivative chiave per l'hashing è che il tempo necessario per craccare l'hash della password può essere aumentato semplicemente aumentando il conteggio delle iterazioni. Ciò rende più facile mantenere gli hash protetti mentre l'hardware diventa sempre più potente senza modificare l'algoritmo di hashing.

L'implementazione di bcrypt non è molto complessa in quanto vi sono molte librerie semplici da usare che fanno il lavoro per voi. Ad esempio: phpass per perl, php e python.

Non sono esattamente un esperto di crittografia, quindi prendi la mia risposta con un pizzico di sale. Tuttavia, questo sembra essere il consenso generale degli esperti da quello che ho letto.

Per quanto riguarda il primo link , credo che la sua risposta sia stata solo alla domanda, non esiste un requisito NIST ufficiale per l'utilizzo di PBKDF2 per le password di hashing. È comunque meglio di un semplice hash SHA.

    
risposta data 25.07.2012 - 11:21
fonte
1
  1. L'iterazione non aumenta sempre il tempo necessario per romperlo a causa della scalabilità hardware lineare.

  2. Perché bcrypt rende i decodificatori hardware più lenti.

  3. Ma questo è il punto di fare PKBF, a più iterazioni, rendendolo più lento in questo modo, tuttavia bcrypt è più strong.

risposta data 25.07.2012 - 11:11
fonte

Leggi altre domande sui tag