Best practice: password saling & peppering?

Mi sono imbattuto in una discussione in cui ho appreso che quello che stavo facendo non stava in realtà salendo le password ma sfiorandole, e da allora ho iniziato a fare entrambe le cose con una funzione come:

hash_function($salt.hash_function($pepper.$password)) [multiple iterations] 

Ignorando l’algoritmo hash scelto (voglio che questo sia una discussione su sali e peperoni e algoritmi non specifici ma sto usando uno sicuro), è un’opzione sicura o dovrei fare qualcosa di diverso? Per coloro che non conoscono i termini:

  • Un salt è un valore generato in modo casuale, di solito memorizzato con la stringa nel database progettato per rendere imansible l’utilizzo delle tabelle hash per violare le password. Siccome ogni password ha il suo sale, devono essere tutte forzate brute singolarmente per craccarle; tuttavia, poiché il sale è memorizzato nel database con l’hash della password, un compromesso del database significa perdere entrambi.

  • Un pepe è un valore statico a livello di sito memorizzato separatamente dal database (solitamente codificato nel codice sorgente dell’applicazione) che è destinato a essere segreto. Viene utilizzato in modo che un compromesso del database non causi la forzatura brute dell’intera tabella delle password dell’applicazione.

C’è qualcosa che mi manca e sta salendo e infarcendo le mie password la migliore opzione per proteggere la sicurezza dei miei utenti? C’è qualche potenziale difetto di sicurezza nel farlo in questo modo?

Nota: si supponga ai fini della discussione che l’applicazione e il database siano memorizzati su macchine separate, non condividano password ecc. Pertanto una violazione del server del database non significa automaticamente una violazione del server delle applicazioni.