Nota bene: Sono consapevole che buona risposta per proteggere l'archiviazione delle password è scrypt o bcrypt . Questa domanda non è per l'implementazione nel software attuale, è per mia comprensione.
Diciamo che Joe Programmer ha il compito di memorizzare in modo sicuro le password degli utenti finali in un database per un'applicazione web; o memorizzazione di password su disco per accessi a un software. Molto probabilmente:
- Ottieni
$passworddall'utente finale. - Crea
$noncecome valore casuale di 64 o 128 bit di grandi dimensioni. - Crea
$hash = SHA256($nonce$password)e salva$nonceinsieme a$hashnel database.
Prima domanda:
Perché il seguente non è sostanzialmente migliore di quello sopra?
- Crea
$long_stringuna volta e una sola volta. Memorizzalo come una costante nel codice dell'applicazione.$long_stringpotrebbe f.x. essere 2 kilobyte di caratteri casuali. - Ottieni
$passworddall'utente finale. - Crea
$mac = HMAC-SHA256($long_string)[$password](cioè crea un MAC utilizzando la password dell'utente finale come chiave) e memorizza questo$macnel database.
Immagino che l'HMAC abbia i seguenti vantaggi?
- Le collisioni sono meno frequenti?
- È computazionalmente un po 'più costoso di semplice hashing? (Ma non ovunque vicino a scrypt, ovviamente.)
- Per riuscire con un attacco di forza bruta entro un tempo ragionevole, e l'attaccante dovrebbe avere accesso a due cose: 1) il database, dove
$macè memorizzato, e < em> 2) il codice dell'applicazione, in cui è memorizzato il$long_stringoriginale. È meglio di una funzione hash, in cui l'hacker deve solo accedere al database?
Ma ancora, nessuno sembra suggerire di usare un HMAC, quindi devo essere frainteso qualcosa?
Seconda domanda:
Quali sarebbero le implicazioni dell'aggiunta di un valore salino $nonce essere?
- Crea
$long_stringuna volta e una sola volta. Salva questo come costante nel codice dell'applicazione. - Ottieni
$passworddall'utente finale. - Crea
$noncecome valore casuale di circa 128 bit di grandi dimensioni. - Crea
$mac = HMAC-SHA256($long_string)[$nonce$password]e salva$noncee$macnel database.