Ja, Sie können es in einem einzelnen Feld speichern, und viele Datenbanken / Anwendungen speichern den Salt + Hash in einem einzelnen Feld / einer einzelnen Datei usw.
Das bekannteste ist Linux (das ist kein DB), der den Hash in der Datei / etc / shadow im folgenden Format speichert:
"$ id $ salt $ hashed", die druckbare Form eines Passwort-Hash, wie er von crypt (C) erstellt wurde. , wobei "$ id" der verwendete Algorithmus ist. (Unter GNU / Linux steht "$ 1 $" für MD5, "$ 2a $" für Blowfish, "$ 2y $" für Blowfish (korrekte Behandlung von 8-Bit-Zeichen), "$ 5 $" für SHA-256 und "$ 6 $" "ist SHA-512, [4] andere Unix-Versionen haben möglicherweise andere Werte wie NetBSD.
(Quelle: https://en.wikipedia.org/wiki/Passwd)
Das Salz soll nicht geheim sein (oder zumindest nicht geheimer als der Hash). Sein Hauptzweck ist es, Brute-Forcing-Angriffe viel schwieriger zu machen, da der Angreifer a verwenden muss Unterschiedliches Salz für jeden einzelnen Benutzer.
Ihre Frage ist jedoch differenzierter - weil Sie nicht nur nach Salzen, sondern auch nach Parametern fragen. Dinge wie der Hashing-Algorithmus, die Iterationszahl und das Salz Speichern Sie dies nicht im Code, sie gehören immer noch in die Datenbank.
Stellen Sie sich vor, Sie haben eine Reihe von Benutzern und Sie haben SHA1 als Hashing-Algorithmus verwendet. Ihr Datenbankfeld würde dies also tun Seien Sie so etwas wie SHA1: SALZ: HASH .
Wenn Sie Ihre Datenbank auf BCRYPT aktualisieren möchten, wie würden Sie dies tun?
Typi Normalerweise würden Sie Code bereitstellen, damit Sie bei der Anmeldung eines Benutzers das Kennwort überprüfen und, falls gültig, das Kennwort mit einem neueren Algorithmus erneut hashen. Jetzt sieht das Feld für den Benutzer folgendermaßen aus: BCRYPT:SALT:HASH .
Aber dann wären einige Benutzer auf SHA1 und andere auf BCRYPT, und da dies bei a ist Auf Benutzerebene benötigen Sie die Parameter, die Ihrem Code mitteilen, welche Benutzer sich in der Datenbank befinden sollen.
Kurz gesagt, das Speichern der Parameter und des Hashs in einem einzelnen Feld ist in Ordnung, aber das Aufteilen aus irgendeinem Grund (Effizienz, einfacher Code usw.) ist ebenfalls in Ordnung. Was nicht in Ordnung ist, ist dies in Ihrem Code zu speichern :)
TL: DR
Troy Hunt hat kürzlich einen Podcast veröffentlicht, in dem vorgeschlagen wird, dass es effektiver ist, einfach alle derzeit vorhandenen SHA1-Hashes zu verwenden, anstatt wie oben beschrieben zu BCRYPT zu migrieren die Datenbank und hashen Sie sie mit BCRYPT.
Effektiv BCRYPT(SHA1(clear_password))
Wenn sich ein Benutzer anmeldet, würden Sie
BCRYPT (SHA1 (clear_password)) == <db_field>
Auf diese Weise wird jeder auf der Plattform gleichzeitig aktualisiert, und Sie haben keine Datenbank mit mehreren Hashs Formate für Passwörter. Sehr sauber und sehr nett.
Ich denke, diese Idee ist absolut sinnvoll, aber obwohl jeder auf einmal migriert, ist sie nicht sofort. Sofern Sie nicht bereit sind, Ausfallzeiten in der App zu akzeptieren (während Sie alle Kennwörter erneut hashen), wird es immer noch eine kleine Zeitspanne geben, in der sich einige Benutzer auf BCRYPT und andere auf SHA1 befinden. Daher sollte Ihre Datenbank die weiterhin speichern Parameter des Hashing-Algorithmus, und Ihr Code würde basierend darauf ausgeführt.