Tak, możesz przechowywać to w jednym polu, a wiele baz danych / aplikacji przechowuje sól + hash w jednym polu / pliku itp.
Najbardziej znany jest Linux (który nie jest DB), który przechowuje hash w pliku / etc / shadow przy użyciu formatu:
"$ id $ salt $ hashed", drukowalna forma skrótu hasła utworzona przez crypt (C) , gdzie „$ id” to używany algorytm. (W systemie GNU / Linux „1 $” oznacza MD5, „$ 2a $” to Blowfish, „$ 2y $” to Blowfish (poprawna obsługa 8-bitowych znaków), „5 $” to SHA-256, a „6 $ $” "to SHA-512, [4] inny Unix może mieć inne wartości, jak NetBSD.
(źródło: https://en.wikipedia.org/wiki/Passwd)
Sól nie ma być tajna (a przynajmniej nie bardziej tajna niż hash). Jej głównym celem jest znacznie utrudnianie ataków siłowych, ponieważ atakujący musi używać inna sól dla każdego użytkownika.
Ale twoje pytanie jest bardziej szczegółowe - ponieważ pytasz nie tylko o sole, ale także o parametry. Rzeczy takie jak algorytm haszujący, liczba iteracji i sól. W każdym przypadku, nie przechowuj tego w kodzie, nadal należą do bazy danych.
Wyobraź sobie, że masz grupę użytkowników i użyłeś SHA1 jako algorytmu haszującego. Więc pole bazy danych być czymś w rodzaju SHA1:SALT:HASH”.
Jeśli chcesz zaktualizować swoją bazę danych do BCRYPT, jak byś to zrobił?
Typi Oczywiście, można wdrożyć kod, aby po zalogowaniu się użytkownika zweryfikować hasło, a jeśli jest prawidłowe - ponownie zaszyfrować hasło przy użyciu nowszego algorytmu. Teraz pole dla użytkownika wygląda następująco: BCRYPT:SALT:HASH”.
Ale niektórzy użytkownicy korzystaliby z SHA1, a inni z BCRYPT, a ponieważ jest to na poziomie użytkownika, potrzebujesz parametrów, które mówią Twojemu kodowi, którzy użytkownicy mają być w bazie danych.
Krótko mówiąc, przechowywanie parametrów i hash w jednym polu jest OK, ale dzielenie ich z dowolnego powodu (wydajność, łatwiejszy kod itp.) również jest OK. Co nie jest w porządku, to przechowywanie tego w swoim kodzie :)
Troy Hunt niedawno opublikował podcast sugerujący, że zamiast przejść do BCRYPT w powyższy sposób, skuteczniej jest po prostu pobrać wszystkie skróty SHA1, które są obecnie w DB i zaszyfruj je za pomocą BCRYPT.
Skutecznie BCRYPT(SHA1(clear_password))
Gdy użytkownik loguje się na tobie
BCRYPT (SHA1 (clear_password)) == <db_field>
W ten sposób wszyscy na platformie zostaną zaktualizowani od razu i nie masz bazy danych z wieloma hashami formaty haseł. Bardzo czysty i bardzo ładny.
Myślę, że ten pomysł ma sens, ale mimo że wszyscy migrują na raz, nie jest to natychmiastowe. Jeśli nie chcesz zaakceptować przestojów w aplikacji (podczas ponownego zhaszowania wszystkich haseł), nadal będzie niewielka przerwa, w której niektórzy użytkownicy będą korzystać z BCRYPT, a niektórzy z SHA1, dlatego twoja baza danych powinna nadal przechowywać parametry algorytmu haszującego, a Twój kod zostanie wykonany na ich podstawie.