Sì, puoi memorizzarlo in un singolo campo e molti database / applicazioni memorizzano l'hash salt + in un singolo campo / file ecc.
Il più famoso è Linux (che non è un DB), che memorizza l'hash nel file / etc / shadow utilizzando il formato:
"$ id $ salt $ hashed", il formato stampabile di un hash della password prodotto da crypt (C) , dove "$ id" è l'algoritmo utilizzato. (Su GNU / Linux, "$ 1 $" sta per MD5, "$ 2a $" è Blowfish, "$ 2y $" è Blowfish (corretta gestione dei caratteri a 8 bit), "$ 5 $" è SHA-256 e "$ 6 $ "è SHA-512, [4] altri Unix possono avere valori diversi, come NetBSD.
(fonte: https://en.wikipedia.org/wiki/Passwd)
Il sale non deve essere segreto (o almeno non più segreto dell'hash). Il suo scopo principale è rendere gli attacchi di forza bruta molto più difficili poiché l'attaccante deve usare un sale diverso per ogni singolo utente.
Ma la tua domanda è più sfumata, perché non stai solo chiedendo sali ma anche parametri. Cose come l'algoritmo di hashing, il conteggio delle iterazioni e il sale. In qualsiasi caso, non memorizzarlo nel codice, appartengono ancora al DB.
Immagina di avere un gruppo di utenti e di aver utilizzato SHA1 come algoritmo di hashing. Quindi il campo del tuo database lo farebbe essere qualcosa come SHA1:SALT:HASH”.
Se volessi aggiornare il tuo database a BCRYPT, come faresti?
Typi normalmente distribuiresti un po 'di codice in modo che quando un utente accede, verifichi la password e, se valida, riesci ad eseguire nuovamente l'hash della password con un algoritmo più recente. Ora il campo per l'utente ha questo aspetto: BCRYPT:SALT:HASH”.
Ma allora alcuni utenti sarebbero su SHA1 e altri su BCRYPT, e poiché questo è a livello utente, hai bisogno dei parametri che dicono al tuo codice quali sono gli utenti che devono essere nel database.
In breve, memorizzare i parametri e l'hash in un singolo campo va bene, ma suddividerli per qualsiasi motivo (efficienza, codice più semplice, ecc.) Va bene anche. Ciò che non va bene è memorizzare questo nel codice :)
Troy Hunt ha recentemente pubblicato un podcast in cui suggerisce che invece di migrare a BCRYPT nel modo sopra, è più efficace prendere semplicemente tutti gli hash SHA1 attualmente presenti il DB e l'hashing utilizzando BCRYPT.
Efficacemente BCRYPT(SHA1(clear_password))
Quando un utente accede a voi
BCRYPT (SHA1 (clear_password)) == <db_field>
In questo modo, tutti sulla piattaforma vengono aggiornati contemporaneamente e non hai un database con più hash formati per le password. Molto pulito e molto carino.
Penso che questa idea abbia perfettamente senso, ma anche se tutti migrano contemporaneamente, non è istantanea. A meno che tu non sia disposto ad accettare un po 'di inattività sull'app (mentre esegui nuovamente l'hash di tutte le password), ci sarà ancora un piccolo intervallo di tempo in cui alcuni utenti sono su BCRYPT e altri su SHA1, quindi il tuo DB dovrebbe ancora memorizzare parametri dell'algoritmo di hashing e il tuo codice verrebbe eseguito in base ad esso.