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
$password
dall'utente finale. - Crea
$nonce
come valore casuale di 64 o 128 bit di grandi dimensioni. - Crea
$hash = SHA256($nonce$password)
e salva$nonce
insieme a$hash
nel database.
Prima domanda:
Perché il seguente non è sostanzialmente migliore di quello sopra?
- Crea
$long_string
una volta e una sola volta. Memorizzalo come una costante nel codice dell'applicazione.$long_string
potrebbe f.x. essere 2 kilobyte di caratteri casuali. - Ottieni
$password
dall'utente finale. - Crea
$mac = HMAC-SHA256($long_string)[$password]
(cioè crea un MAC utilizzando la password dell'utente finale come chiave) e memorizza questo$mac
nel 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_string
originale. È 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_string
una volta e una sola volta. Salva questo come costante nel codice dell'applicazione. - Ottieni
$password
dall'utente finale. - Crea
$nonce
come valore casuale di circa 128 bit di grandi dimensioni. - Crea
$mac = HMAC-SHA256($long_string)[$nonce$password]
e salva$nonce
e$mac
nel database.