Solenie hasła: najlepsze praktyki?

162

Zawsze byłem ciekawy ... Co jest lepsze, gdy zasolisz hasło do haszowania: prefiks czy postfiks? Czemu? Czy to ma znaczenie, jeśli solisz?

Aby wyjaśnić: Wszyscy (miejmy nadzieję) już wiemy, że powinniśmy posolić hasło, zanim zaszyfrujemy je do przechowywania w bazie danych [ Edycja: Więc możesz uniknąć rzeczy takich jak to, co ostatnio przytrafiło się Jeffowi Atwoodowi ]. Zwykle odbywa się to przez połączenie soli z hasłem przed przekazaniem go przez algorytm haszujący. Ale przykłady są różne ... Niektóre przykłady poprzedzają sól przed hasłem. Niektóre przykłady dodają sól po haśle. Widziałem nawet takich, którzy próbowali umieścić sól na środku.

Więc która metoda jest lepsza i dlaczego? Czy istnieje metoda zmniejszająca ryzyko kolizji hash? Moje Googlowanie nie znalazło przyzwoitej analizy na ten temat.

Edycja: świetne odpowiedzi, ludzie! Przepraszam, że mogłem wybrać tylko jedną odpowiedź. :)

Randolpho
źródło
1
@Jaccco: niesamowite wejście. Dzięki!
Randolpho
3
Najlepszą praktyką jest użycie funkcji kryptograficznej, która wykonuje salting za Ciebie, używając PBKDF2 (standard), bcrypt lub nawet scrypt. Dzięki Stephenowi za wskazanie tego.
Maarten Bodewes
1
Prawie wszystkie standardowe konstrukcje haszowania haseł uwzględniają połączenie soli i hasła, więc nie powinieneś się tym martwić. Jeśli nie używasz standardowego skrótu hasła, przejdź na jeden.
CodesInChaos
1
@Omu Zła rekomendacja. 1) Pojedyncza iteracja SHA-1 jest zbyt szybka, powinieneś użyć co najmniej 10000, a nawet to dość słabe. 2) Sól domyślna jest za mała. Minimum 8 bajtów i zalecane 16.
CodesInChaos

Odpowiedzi:

111

Prefiks lub sufiks jest nieistotny, chodzi tylko o dodanie do hasła entropii i długości.

Powinieneś rozważyć te trzy rzeczy:

  1. Sól musi być inna dla każdego przechowywanego hasła. (To dość powszechne nieporozumienie.)
  2. Użyj bezpiecznego kryptograficznie generatora liczb losowych.
  3. Wybierz wystarczająco długą sól. Pomyśl o problemie urodzinowym.

Jest doskonała odpowiedź Dave'a Sherohmana na inne pytanie, dlaczego powinieneś używać losowo generowanych soli zamiast nazwy użytkownika (lub innych danych osobowych). Jeśli zastosujesz się do tych sugestii, naprawdę nie ma znaczenia, gdzie włożysz sól.

Georg Schölly
źródło
4
Dodałem link do starego pytania, przeczytaj te odpowiedzi. Zasadniczo, nie używając innej losowej soli dla hasła, narażasz się na niepotrzebne zagrożenie bezpieczeństwa, co może stanowić prawdziwy problem w przyszłości.
Georg Schölly
39
Losowe działanie w całej witrynie jest złe, ponieważ osoba atakująca może wstępnie obliczyć tabele tęczowe i przejąć całą bazę danych użytkowników. Jeśli tego nie rozumiesz, nie pisz do logowania / systemów bezpieczeństwa :) - POTRZEBUJESZ soli na użytkownika.
snemarch
3
Tak, sól na użytkownika. Idealnie, z przechowywanymi iteracjami dla każdego użytkownika (dzięki czemu można zwiększyć liczbę iteracji używanych w czasie). Każdy porządny framework będzie miał to wbudowane. (.NET ma PasswordDeriveBytes które będą obsługiwać wszystko za Ciebie.)
MichaelGG
2
Jeśli projektujesz jakikolwiek system bezpieczeństwa, to jest on sprytny bez użycia soli na użytkownika. Twoja witryna może nie być super interesująca, ale rozważ, jak użytkownicy używają tego samego hasła w wielu witrynach ... próba zapewnienia bezpieczeństwa bazy danych zwykle
kończy
2
Oczywiście sole chronią przed atakami słownikowymi, właśnie przez to, że są znacznie wolniejsze. Użycie soli w hasłach znacznie wyprzedza tęczowe tablice. Sole zostały dodane specjalnie w celu spowolnienia ataków słownikowych, uniemożliwiając atakującym jednokrotne zahaszowanie hasła, a następnie porównanie go ze wszystkimi użytkownikami.
Glenn Maynard
27

Myślę, że to wszystko semantyka. Umieszczenie go przed lub po nie ma znaczenia, z wyjątkiem bardzo konkretnego modelu zagrożenia.

Fakt, że tam jest, ma pokonać tęczowe tablice.

Model zagrożenia, do którego nawiązywałem, byłby scenariuszem, w którym przeciwnik może mieć tęczowe tabele soli pospolitych dołączane / poprzedzane do hasła. (Powiedz NSA) Zgadujesz, że albo mają to dołączone, albo poprzedzone, ale nie oba. To głupie i kiepskie przypuszczenie.

Lepiej byłoby założyć, że mają możliwość przechowywania tych tęczowych tabel, ale nie, powiedzmy, tabel z dziwnymi solami przeplatanymi w środku hasła. W tej wąskiej przypadku, chciałbym przypuszczać, że przeplatane będzie najlepiej.

Tak jak powiedziałem. To semantyka. Wybierz inną sól dla hasła, długą sól i umieść w niej dziwne znaki, takie jak symbole i kody ASCII: © ¤¡

Tom Ritter
źródło
@onebyone, cholera! Odkrył moją sól z „soli hasłowej”!
Samuel
6
@Samuel: Nie wiem jak wy, ale używamy „12345” dla naszej soli. :)
Randolpho,
@onebyone ważne. Naprawdę miałem na myśli „powszechne” jako „wszystkie sole poniżej długości X w zestawie znaków Y”, gdzie X, Y są rozsądne; powiedz 20 znaków i alfanumeryczne wielkie / małe litery. Wysuwana powiedzieć wszystkie ciągi szesnastkowe pod długości Z (powiedzmy 160), ponieważ myślę, że tęczowe tablice z hashed mieszań byłaby przydatna ..
Tom Ritter
1
@Randolpho: Hej, to też moja sól! Jakie są szanse?
Adrien
I upewnij się, że sól jest nieprzewidywalna / Losowa: stackoverflow.com/questions/1645161/ ...
Jacco
18

Prawdziwa odpowiedź, której nikt chyba nie poruszył, jest taka, że obie są w błędzie . Jeśli wdrożenie własnego kryptograficznych, nie ważne jak błahe część myślisz robisz, to idą do popełniania błędów.

HMAC to lepsze podejście, ale nawet jeśli używasz czegoś takiego jak SHA-1, już wybrałeś algorytm, który nie nadaje się do haszowania haseł ze względu na jego projekt pod kątem szybkości. Użyj czegoś takiego jak bcrypt lub prawdopodobnie scrypt i całkowicie usuń problem z rąk.

Aha, i nawet nie myśl o porównywaniu wynikowych skrótów dla równości z językiem programowania lub narzędziami do porównywania ciągów bazy danych. Porównują znak po znaku i zwierają, falsejakby znak był inny. Więc teraz atakujący mogą używać metod statystycznych, aby spróbować ustalić, czym jest skrót, znak po znaku.

Stephen Touset
źródło
1
Odnośnie ostatniego akapitu: w jaki sposób atakujący mógł uzyskać informacje o dokładnej liczbie znaków, których porównanie nie powiodło się? To nie ma sensu ...
halloweenlv
1
Jesteś zarówno poprawny, jak i niepoprawny. Ataki czasowe są prawdziwe i wielokrotnie wykazano, że są wykonalne z przerażającą dokładnością, nawet w przypadku połączeń sieciowych o zmiennym opóźnieniu, aby dokładnie określić, gdzie porównanie zawiodło. To powiedziawszy, ataki czasowe w rzeczywistości nie mają zastosowania do zwykłych skrótów haseł, ponieważ znalezienie danych wejściowych, które zmieniają tylko małe części danych wyjściowych, jest niemożliwe z obliczeń.
Stephen Touset
9

To nie powinno mieć żadnego znaczenia. Hasz nie będzie łatwiejszy do odgadnięcia, gdziekolwiek umieścisz sól. Zderzenia skrótów są zarówno rzadkie, jak i nieprzewidywalne, ponieważ są celowo nieliniowe. Gdyby miało to wpływ na bezpieczeństwo, oznaczałoby to problem z haszowaniem, a nie soleniem.

Phil H.
źródło
1
Zderzenia z skrótem zależą od rozmiaru skrótu. Dzięki problemowi urodzinowemu kolizje są dość prawdopodobne.
Georg Schölly
2
Tylko jeśli skrócisz wynik. W każdym razie nadal uważam, że nie będzie miało znaczenia, gdzie jest sól, ponieważ celem skrótu jest to, aby związek między danymi wejściowymi i wyjściowymi nie zawierał żadnych wzorców.
Phil H
7

Jeśli używasz kryptograficznie bezpiecznego skrótu, nie powinno mieć znaczenia, czy wykonujesz prefiks czy postfiks; punkt haszowania polega na tym, że zmiana jednego bitu w danych źródłowych (bez względu na to, gdzie) powinna dać inny hash.

Co jest ważne, choć jest za pomocą długich soli, wytwarzając je z odpowiednim PRNG kryptograficznego, a po sole poszczególnych użytkowników. Przechowywanie sole poszczególnych użytkowników w bazie danych to nie to kwestia bezpieczeństwa, stosując w całej witrynie hash jest .

snemarch
źródło
2
Zła odpowiedź: osoba atakująca może wstępnie obliczyć MD (hasło) dla wielu często używanych haseł, a następnie bardzo tanio obliczyć MD (hasło + sól), ponieważ skrót wiadomości działa w sposób przyrostowy, aby obsługiwać przesyłanie strumieniowe.
Erwan Legrand,
5

Po pierwsze, termin „stół tęczowy” jest konsekwentnie nadużywany. Tablica „tęczowa” jest po prostu szczególnym rodzajem tabeli przeglądowej, która umożliwia określony rodzaj kompresji danych na klawiszach. Zamieniając obliczenia na miejsce, tabelę wyszukiwania, która zajęłaby 1000 TB, można skompresować tysiąc razy, aby można ją było przechowywać na mniejszym dysku.

Powinieneś się martwić o hash do tabel wyszukiwania haseł, tęczy lub w inny sposób.

@ onebyone.livejournal.com:

Atakujący ma „tęczowe tablice” składające się nie z skrótów słów ze słownika, ale ze stanu obliczenia skrótu tuż przed zakończeniem obliczania skrótu.

Wówczas tańsze byłoby wymuszenie brutalnego wpisu w pliku z hasłem za pomocą soli postfiksowej niż sól przedrostka: dla każdego słowa ze słownika z kolei ładowałbyś stan, dodawał bajty soli do skrótu, a następnie finalizował. Z przedrostkiem sól nie byłoby nic wspólnego między obliczeniami dla każdego słowa słownikowego.

W przypadku prostej funkcji skrótu, która skanuje liniowo ciąg wejściowy, na przykład prosty generator liniowy kongruencji, jest to praktyczny atak. Ale kryptograficznie bezpieczna funkcja skrótu jest celowo zaprojektowana tak, aby miała wiele rund, z których każda wykorzystuje wszystkie bity ciągu wejściowego, więc obliczenie stanu wewnętrznego tuż przed dodaniem soli nie ma sensu po pierwszej rundzie. Na przykład SHA-1 ma 80 rund.

Ponadto algorytmy haszujące hasła, takie jak PBKDF, tworzą swoją funkcję skrótu wielokrotnie (zaleca się iterację PBKDF-2 minimum 1000 razy, każda iteracja dwukrotnie stosuje SHA-1), czyniąc ten atak podwójnie niepraktycznym.

cygil
źródło
Powinieneś dokładnie sprawdzić opis rund. Rundy są podzielone na fragmenty, a nie całą wiadomość. (W przeciwnym razie haszowanie danych strumieniowych wymagałoby wielokrotnego przewijania). Jednak używanie iteracji zapobiega problemowi, o którym ktoś wspomina.
MichaelGG,
4

Skrót BCrypt, jeśli platforma ma dostawcę. Uwielbiam to, jak nie martwisz się tworzeniem soli i możesz je wzmocnić, jeśli chcesz.

Samuel
źródło
3
O ile wiem, BCrypt Hash wymaga solenia, tak jak każdy inny schemat mieszania.
Jacco,
2

Wstawienie soli dowolnej liczby znaków do hasła jest najmniej oczekiwanym przypadkiem, a zatem jest najbardziej „bezpiecznym” społecznie, ale w ogólnym przypadku nie ma to większego znaczenia, o ile używasz długiego unikalnego hasła sznurki do soli.

jeffcook2150
źródło