Update: There is a better way to add a server side key, than using it as a pepper. With a pepper an attacker must gain additional privileges on the server to get the key. The same advantage we get by calculating the hash first, and afterwards encrypting the hash with the server side key (two way encryption). This gives us the option to exchange the key whenever this is necessary.
Per le password di hashing in un database, vorrei aggiungere un pepe alla funzione hash. Naturalmente questo pepe sarà aggiunto al sale unico.
Il motivo per cui voglio aggiungere un pepe è che impedisce un attacco del dizionario, nel caso in cui l'autore dell'attacco abbia solo accesso al database, ma non al server (tipico di Sql-Injection). Secondo me è meglio di un hash senza pepe, anche se il pepe è solo hardcoded (per evitare la complessità del codice).
Ora mi chiedo, come il pepe dovrebbe essere applicato correttamente, è corretto semplicemente aggiungere il pepe alla password prima dell'hashing?
1. Concatenare password e pepe
$passwordHash = bcrypt($password . $pepper, $salt);
Un motivo contro questo potrebbe essere, che le password più grandi del limite di bcrypt (55 caratteri) non otterranno il pepe, anche se le password di questa lunghezza non sono comunque propense in un dizionario. 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 peperone, 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 di hash per combinare password e pepe, prima dell'hashing. È appropriato usare sha256, o quale funzione di hash sarebbe 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 sull'uso diretto di SHA256? Dal momento che vogliamo solo combinare password e pepe, e la sicurezza viene dopo dal bcrypt, non vedo alcun vantaggio apparente.
Qualsiasi suggerimento utile è molto apprezzato.