it-swarm.dev

Come applicare correttamente un pepe su criptovaluta?

Aggiornamento: esiste un modo migliore per aggiungere una chiave lato server piuttosto che usarla come pepe. Con un peperone un utente malintenzionato deve ottenere ulteriori privilegi sul server per ottenere la chiave. Lo stesso vantaggio si ottiene calcolando prima l'hash e successivamente crittografando l'hash con la chiave lato server (crittografia bidirezionale). Questo ci dà la possibilità di scambiare la chiave ogni volta che è necessario.

Per le password di hashing in un database, vorrei aggiungere un pepe alla funzione hash. Ovviamente questo pepe sarà in aggiunta al sale unico.

Il motivo per cui voglio aggiungere un peperone è che impedisce un attacco del dizionario, nel caso in cui l'attaccante abbia accesso solo al database, ma non al server (tipico per Sql-Injection). Secondo me questo è meglio di un hash senza pepe, anche se il pepe è solo hardcoded (per evitare la complessità del codice).

Ora mi chiedo come applicare correttamente il pepe, è giusto aggiungere il pepe alla password prima dell'hash?

1. Concatenare password e pepe

$passwordHash = bcrypt($password . $pepper, $salt);

Una ragione potrebbe essere che le password più grandi del limite di criptovaluta (55 caratteri) non otterranno il vantaggio, anche se le password di questa lunghezza non sono probabilmente in un dizionario comunque. A causa di questo limite, il pepe viene aggiunto dopo la password e non prima. Un altro motivo potrebbe essere che se l'attaccante conosce il pepe, conosce anche la fine di tutte le nostre password pepate.

2. Combina password e pepe con hash

$passwordHash = bcrypt(hash('sha256', $password . $pepper), $salt);

Quindi potremmo usare una funzione hash per combinare password e pepe, prima dell'hash. È appropriato usare sha256, o quale funzione hash sarebbe l'ideale, quando vogliamo usare bcrypt in seguito?

3. Combina password e pepe con hmac

$passwordHash = bcrypt(hash_hmac('sha256', $password, $pepper), $salt);

Spesso un hmac è la soluzione consigliata, c'è qualche vantaggio rispetto all'utilizzo diretto di SHA256? Dal momento che vogliamo solo combinare password e pepper, e la sicurezza viene dopo da bcrypt, non riesco a vedere alcun vantaggio apparente.

Eventuali suggerimenti utili sono molto apprezzati.

38
martinstoeckli

I tuoi tre metodi sono corretti. Il terzo (con HMAC) potrebbe essere un po 'più "elegante", matematicamente parlando: renderebbe più semplice dimostrare la sicurezza della costruzione, relativamente a quella di bcrypt e HMAC.

Attenzione, tuttavia, di byte null. Una determinata implementazione di bcrypt potrebbe prevedere un stringa di caratteri e fermarsi al primo byte del valore 0, che può verificarsi nell'output di SHA-256 o HMAC (o come parte della chiave binaria che usi come pepe), ignorando tutti i byte successivi. Sarebbe un grave problema e non lo noteresti. Per evitare questo problema, potresti voler codificare Base64 l'output SHA-256 o HMAC prima di assegnarlo a bcrypt (l'output SHA-256 con codifica Base64 è di 44 caratteri, ancora al di sotto del limite di bcrypt).

31
Thomas Pornin