Sì, puoi archiviarlo in un unico 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 usando il formato:
"$id$salt$hashed", the printable form of a password hash as produced
by crypt (C), where "$id" is the algorithm used. (On GNU/Linux, "$1$"
stands for MD5, "$2a$" is Blowfish, "$2y$" is Blowfish (correct
handling of 8-bit chars), "$5$" is SHA-256 and "$6$" is SHA-512,[4]
other Unix may have different values, like NetBSD.
(source: https://en.wikipedia.org/wiki/Passwd)
Il sale non vuole essere segreto (o almeno non più segreto dell'hash). Il suo scopo principale è quello di rendere gli attacchi forzanti brute 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 dei sali ma anche dei parametri. Cose come l'algoritmo di hashing, il conteggio delle iterazioni e il sale. In ogni caso, non memorizzarlo nel codice, appartengono ancora al DB.
Immagina di avere un sacco di utenti e hai usato SHA1 come algoritmo di hashing. Quindi il campo del tuo database dovrebbe essere qualcosa come SHA1: SALT: HASH .
Se vuoi aggiornare il tuo database a BCRYPT, come faresti?
Normalmente dovresti distribuire del codice in modo che quando un utente si connette, verifica la password e, se valida, re-hash la password con un nuovo algoritmo. Ora il campo per l'utente è simile a questo: BCRYPT: SALT: HASH .
Tuttavia, alcuni utenti potrebbero trovarsi su SHA1 e altri su BCRYPT, e poiché questo è a livello di utente, sono necessari i parametri che indicano al tuo codice quali utenti devono trovarsi nel Database.
In breve, memorizzare i parametri e l'hash in un singolo campo è OK, ma dividerli per qualsiasi motivo (efficienza, codice più semplice ecc.) è anche OK. Cosa non va bene è la memorizzazione nel codice:)
TL: DR
Troy Hunt ha recentemente pubblicato un podcast che suggerisce che invece di migrare a BCRYPT nel modo sopra descritto, è più efficace prendere semplicemente tutti gli hash SHA1 attualmente nel DB e cancellarli con BCRYPT.
Effettivamente BCRYPT(SHA1(clear_password))
Quando un utente si connette avresti
BCRYPT(SHA1(clear_password)) == <db_field>
In questo modo, tutti sulla piattaforma vengono aggiornati contemporaneamente e non si dispone di un database con più formati hash per le password. Molto pulito e molto bello.
Penso che questa idea abbia perfettamente senso, ma anche se tutti migrano contemporaneamente, non è istantaneo. A meno che tu non sia disposto ad accettare alcuni tempi di inattività sull'app (mentre re-hash tutte le password), ci sarà comunque un piccolo intervallo di tempo in cui alcuni utenti sono su BCRYPT e alcuni su SHA1, quindi il tuo DB dovrebbe comunque archiviare il i parametri dell'algoritmo di hashing e il tuo codice verrebbe eseguito in base ad esso.