Oui, vous pouvez le stocker dans un seul champ, et de nombreuses bases de données / applications stockent le sel + le hachage dans un seul champ / fichier etc.
Le plus célèbre est Linux (qui n'est pas un DB), qui stocke le hachage dans le fichier / etc / shadow en utilisant le format:
"$ id $ salt $ hashed", la forme imprimable d'un hachage de mot de passe tel que produit par crypt (C) , où "$ id" est l'algorithme utilisé. (Sous GNU / Linux, "$ 1 $" signifie MD5, "$ 2a $" est Blowfish, "$ 2y $" est Blowfish (gestion correcte des caractères 8 bits), "$ 5 $" est SHA-256 et "$ 6 $ "est SHA-512, [4] d'autres Unix peuvent avoir des valeurs différentes, comme NetBSD.
(source: https://en.wikipedia.org/wiki/Passwd)
Le sel n'est pas censé être secret (ou du moins pas plus secret que le hachage). Son objectif principal est de rendre les attaques par force brute beaucoup plus difficiles puisque l'attaquant doit utiliser un sel différent pour chaque utilisateur.
Mais votre question est plus nuancée - parce que vous ne posez pas seulement des questions sur les sels, mais aussi sur les paramètres. Des choses comme l'algorithme de hachage, le nombre d'itérations et le sel. cas, ne stockez pas cela dans le code, ils appartiennent toujours à la base de données.
Imaginez que vous avez un groupe d'utilisateurs et que vous avez utilisé SHA1 comme algorithme de hachage. Donc, votre champ de base de données être quelque chose comme SHA1:SALT:HASH Si vous vouliez mettre à niveau votre base de données vers BCRYPT, comment feriez-vous cela?
Typi En général, vous déploieriez du code de sorte que lorsqu'un utilisateur se connecte, vous vérifiez le mot de passe, et s'il est valide, vous hachez à nouveau le mot de passe avec un algorithme plus récent. Maintenant, le champ de l'utilisateur ressemble à ceci: BCRYPT:SALT:HASH Mais alors certains utilisateurs seraient sur SHA1, et d'autres sur BCRYPT, et comme il s'agit d'un niveau utilisateur, vous avez besoin des paramètres qui indiquent à votre code quels utilisateurs doivent être dans la base de données.
En bref, stocker les paramètres et le hachage dans un seul champ est OK, mais les diviser pour une raison quelconque (efficacité, code plus simple, etc.) est également OK. Ce qui ne va pas, c'est de le stocker dans votre code :)
TL:DR↑
Troy Hunt a récemment publié un podcast suggérant qu'au lieu de migrer vers BCRYPT de la manière ci-dessus, il est plus efficace de simplement prendre tous les hachages SHA1 actuellement dans la base de données, et les hacher en utilisant BCRYPT.
En fait, BCRYPT(SHA1(clear_password))
Lorsqu'un utilisateur se connecte, vous
BCRYPT (SHA1 (clear_password)) == <db_field>
De cette façon, tout le monde sur la plate-forme est mis à jour en même temps, et vous n'avez pas de base de données avec plusieurs hachages formats des mots de passe. Très propre et très agréable.
Je pense que cette idée est parfaitement logique, mais même si tout le monde migre en même temps, ce n'est pas instantané. À moins que vous ne vouliez accepter des temps d'arrêt sur l'application (pendant que vous hachez à nouveau tous les mots de passe), il y aura encore un petit intervalle de temps où certains utilisateurs sont sur BCRYPT et d'autres sur SHA1, par conséquent, votre base de données devrait toujours stocker le paramètres de l'algorithme de hachage, et votre code s'exécuterait en fonction de celui-ci.