Il "pepe" è un valore segreto che si presume essere fuori dalla portata dell'attaccante. Hai hash password perché supponi che l'utente malintenzionato possa dare un'occhiata alle viscere del tuo server (vedi this per una discussione). Il "pepe" aggiunge ulteriore sicurezza se si ritiene che lo scorcio sia parziale : l'autore dell'attacco potrebbe leggere, ad esempio, il contenuto del database (un risultato comune degli attacchi SQL injection), ma non file di configurazione sul server Web stesso.
Senza un pepe, un utente malintenzionato che ottiene la password con hash può "provare le password a casa" perché può ricalcolare lo stesso hash su qualsiasi password potenziale e vedere se il risultato corrisponde a ciò che ha rubato dal server. Ma se il calcolo dell'hash è "pepato", allora l'attaccante non può eseguire l'hash a casa, a meno che non conosca anche il valore del pepe. Crittograficamente parlando, il "pepe" è una chiave segreta e inserendolo nel processo di hashing trasforma la funzione di hash in un MAC . Il pepe è esattamente prezioso quanto segreto, cioè non immaginabile dall'attaccante.
Vedi questa risposta per un primer sull'hash delle password . C'è una sezione su peppering (vicino alla fine). Ricorda che l'hashing della password ha senso solo quando la violazione dell'attaccante è parziale (ha solo una sbirciatina di sola lettura) e il peppering ha senso solo quando la violazione è doppiamente parziale: non solo l'aggressore ha ottenuto solo una sbirciatina di sola lettura, ma quella sbirciatina non era per il contenuto completo del server. Quando si accumulano supposizioni su altre ipotesi, ad un certo punto non è più abbastanza realistico per meritare lo sforzo; questo è il motivo per cui il peppering tende a rimanere raro nella pratica.
"Peppering" entra nel regno di ciò che è fattibile con dispositivi economici simili a HSM , per i quali rende molto senso. Se mirate a una soluzione solo software, l'utilità del pepe è, nel migliore dei casi, discutibile; se fai usi un pepe, almeno fallo bene.
Vale a dire, per una password utente p e il pepe k , calcola HMAC ( p , k ) (calcola il HMAC di p con il pepe k come chiave per HMAC, utilizzare HMAC / SHA-256 se possibile, anche se HMAC / SHA-1 andrebbe bene nella pratica). Quindi , usa l'output HMAC in una normale funzione di hashing della password, completa di sale univoco / casuale e molte iterazioni, come bcrypt o PBKDF2 (no, il peppering non non rimuove il bisogno di un buon sale). HMAC / SHA-256 produce un output binario a 32 byte, che potrebbe essere necessario convertire in caratteri se la libreria bcrypt o PBKDF2 richiede caratteri; Base64 trasformerà 32 byte in 44 caratteri. L'hashing normale è pensato per garantire un certo livello di robustezza se l'hacker riesce a ottenere sia le password con hash che il valore del pepe. Se si combinano HMAC e bcrypt / PBKDF2 come spiegato sopra, quindi, almeno , il "pepe" non renderà il server più debole , che è sempre un rischio quando si fa la crittografia fatta in casa.