Nieprzypadkowa sól dla hashów haseł

Aktualizacja: niedawno dowiedziałem się z to pytanie , że w całej dyskusji poniżej, ja (i jestem pewien, że inni też) było nieco mylące: to, co wciąż nazywam tęczową tabelą, w rzeczywistości nazywa się tabelą hash. Tęczowe stoły są bardziej złożonymi stworzeniami i w rzeczywistości są odmianą łańcuchów Hashowych Hellmana. Chociaż uważam, że odpowiedź jest nadal taka sama (ponieważ nie sprowadza się do kryptoanalizy), część dyskusji może być nieco wypaczona.
Pytanie: "Jakie są tęczowe stoły i jak są używane?"


Zazwyczaj zawsze zalecam użycie silnej kryptograficznie wartości losowej jako salt, do użycia z funkcjami hashowymi( np. dla haseł), takimi jak ochrona przed atakami Rainbow Table.

Ale czy rzeczywiście jest to kryptograficznie konieczne, aby sól była losowa? Czy jakaś unikalna wartość (unique per user, np. userId) wystarczy w tym względzie? W rzeczywistości uniemożliwiłoby to użycie jednej tabeli tęczy do złamania wszystkich (lub większości) hasła w systemie...
Ale czy brak entropii naprawdę osłabia siłę kryptograficzną funkcji hash?


Uwaga, nie pytam o to, po co używać salt, jak go chronić( nie musi być), używając pojedynczej stałej hash (don ' t), ani jakiego rodzaju funkcji hash używać.
Tylko czy sól potrzebuje entropii czy nie.


Dzięki wszystkim za odpowiedzi na razie, ale chciałbym skupić się na obszarach ,które jestem (trochę) mniej zaznajomiony. Głównie implikacje dla kryptoanaliza-byłbym bardzo wdzięczny, gdyby ktoś miał jakiś wkład z krypto-matematycznego PoV.
Ponadto, jeśli istnieją dodatkowe wektory, które nie były brane pod uwagę, to jest to również świetne wejście (patrz punkt @Dave Sherohman na wielu systemach).
Poza tym, jeśli masz jakąś teorię, pomysł lub najlepszą praktykę - proszę poprzeć to dowodem, scenariuszem ataku lub dowodami empirycznymi. Lub nawet zasadne rozważania dotyczące akceptowalnych kompromisów... Jestem zaznajomiony z Best Practice (capital B capital P) na chciałbym udowodnić, jaką wartość to daje.


EDIT: kilka naprawdę dobrych odpowiedzi tutaj, ale myślę, że jak mówi @ Dave, sprowadza się do tęczowych tabel dla wspólnych nazw użytkowników... i możliwe mniej popularne nazwy też. Co jednak zrobić, jeśli moje nazwy użytkowników są unikalne globalnie? Niekoniecznie unikalne dla mojego systemu, ale dla każdego użytkownika - np. adres e-mail.
Nie byłoby zachęty do budowania RT dla pojedynczego użytkownika( jak podkreślił @ Dave, sól nie jest utrzymywana w tajemnicy), a to i tak zapobiegnie gromadzeniu się. Jedynym problemem byłoby to, że mogę mieć ten sam adres e - mail i hasło na innej stronie-ale salt i tak nie zapobiegnie temu.
Więc wraca do kryptoanalizy - czy Entropia jest konieczna, czy nie? (Moim obecnym zdaniem nie jest to konieczne z punktu widzenia kryptoanalizy, ale jest to z innych praktycznych powodów.)

Author: Luke Girvin, 2009-02-11

9 answers

Sól jest tradycyjnie przechowywana jako prefiks do hashowanego hasła. To już sprawia, że jest on znany każdemu atakującemu z dostępem do hash hasła. Używanie nazwy użytkownika jako salt lub not nie ma wpływu na tę wiedzę, a zatem nie miałoby wpływu na bezpieczeństwo pojedynczego systemu.

Jednak użycie nazwy użytkownika lub innej wartości kontrolowanej przez użytkownika jako salt zmniejszyłoby bezpieczeństwo między systemami, jako użytkownika, który miał tę samą nazwę użytkownika i hasło na wielu systemach, które używają tego samego hasła algorytm hashujący miałby taki sam hash hasła na każdym z tych systemów. Nie uważam tego za znaczącą odpowiedzialność, ponieważ jako atakujący spróbowałbym najpierw haseł, o których wiadomo, że konto docelowe używało w innych systemach, zanim spróbowałbym innych środków na narażenie konta. Identyczne hasze tylko z góry powiedzą mi, że znane hasło będzie działać, nie ułatwią faktycznego ataku. (Zauważ jednak, że szybkie porównanie konta bazy danych dostarczyłyby listę celów o wyższym priorytecie, ponieważ powiedziełyby mi, kto jest, a kto nie używa ponownie haseł.)

Większe niebezpieczeństwo związane z tym pomysłem polega na tym, że nazwy użytkowników są powszechnie używane - prawie każda witryna, którą chcesz odwiedzić, będzie miała konto użytkownika o nazwie "Dave", na przykład, a "admin" lub "root" są jeszcze bardziej powszechne - co uczyniłoby konstrukcję tabel rainbow skierowanych do użytkowników o tych popularnych nazwach znacznie łatwiejsze i skuteczniejsze.

Obie te wady można je skutecznie rozwiązać, dodając drugą wartość salt (stałą i ukrytą lub odsłoniętą jak standardowy salt) do hasła przed jego zahaszowaniem, ale w tym momencie równie dobrze możesz używać standardowego entropic salt zamiast używać nazwy użytkownika.

Edited to Add: Wiele osób mówi o entropii i czy Entropia w soli jest ważna. Jest, ale nie z tego powodu większość komentarzy na ten temat wydaje się myśleć.

Myśl ogólna wydaje się, że entropia jest ważna, więc sól będzie trudna do odgadnięcia dla napastnika. Jest to błędne i w rzeczywistości zupełnie nieistotne. Jak już kilka razy wskazywali różni ludzie, ataki, na które będzie wpływał salt, mogą być dokonywane tylko przez kogoś z bazą haseł, a ktoś z bazą haseł może po prostu sprawdzić, czym jest sól każdego konta. Czy to zgadywalne, czy nie, nie ma znaczenia, kiedy możesz trywialnie to sprawdzić.

Powód to, że entropia jest ważne jest, aby uniknąć grupowania wartości soli. Jeśli salt opiera się na nazwie użytkownika i wiesz, że większość systemów będzie miała konto o nazwie "root" lub "admin", możesz zrobić tęczową tabelę dla tych dwóch soli i złamie większość systemów. Jeśli z drugiej strony używa się losowej soli 16-bitowej, a wartości losowe mają mniej więcej równomierny rozkład, to potrzebna jest tabela tęczowa dla wszystkich możliwych soli 2^16.

Nie chodzi o to, żeby napastnik nie wiedział czym jest sól konta indywidualnego, chodzi o to, aby nie dać im dużego, tłustego celu pojedynczej soli, która będzie używana na znacznej części potencjalnych celów.

 151
Author: Dave Sherohman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 23:06:34

Stosowanie soli o wysokiej entropii jest absolutnie niezbędne do bezpiecznego przechowywania haseł.

Weź moją nazwę użytkownika ' gs 'i dodaj ją do mojego hasła' MyPassword ' daje gsMyPassword. Jest to łatwo złamane przy użyciu tabeli rainbow, ponieważ jeśli nazwa użytkownika nie ma wystarczającej entropii, może być tak, że ta wartość jest już przechowywana w tabeli rainbow, szczególnie jeśli nazwa użytkownika jest krótka.

Kolejnym problemem są ataki, w których wiadomo, że użytkownik uczestniczy w dwóch lub więcej usługach. Tam jest wiele wspólnych nazw użytkowników, prawdopodobnie najważniejsze z nich to admin i root. Jeśli ktoś stworzył tęczową tabelę z najczęściej używanymi nazwami użytkowników, mógłby użyć ich do skompromitowania kont.

Kiedyś mieli 12-bitową sól . 12 bitów to 4096 różnych kombinacji. To nie było wystarczająco bezpieczne, ponieważ tyle informacji można łatwo przechowywać w dzisiejszych czasach . To samo dotyczy 4096 najczęściej używanych nazw użytkowników. Jest prawdopodobne, że kilku użytkowników będzie wybieraj nazwę użytkownika, która należy do najpopularniejszych nazw użytkowników.

Znalazłem ten password checker który sprawdza entropię twojego hasła. Posiadanie mniejszej entropii w hasłach (jak używanie nazw użytkowników) znacznie ułatwia rainbowtables, ponieważ starają się pokryć przynajmniej wszystkie hasła o niskiej entropii, ponieważ są one bardziej prawdopodobne.

 29
Author: Georg Schölly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 20:27:14

Prawdą jest, że sama nazwa użytkownika może być problematyczna, ponieważ ludzie mogą udostępniać nazwy użytkowników między różnymi witrynami. Ale powinno być raczej bezproblemowe, jeśli użytkownicy mieli inną nazwę na każdej stronie. Dlaczego więc nie uczynić go wyjątkowym na każdej stronie internetowej. Hashuj hasło nieco tak

Hashfunction("www.yourpage.com/" + username+" / " +password)

To powinno rozwiązać problem. Nie jestem mistrzem kryptoanalizy, ale wątpię, że nie używamy wysokiej entropii to by osłabiło hash.

 8
Author: konne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-26 17:18:18

Lubię używać obu: wysokiej entropii przypadkowej soli na rekord, plus unikalny identyfikator samego rekordu.

Choć to nie wnosi wiele do bezpieczeństwa przed atakami słownikowymi itp., usuwa przypadek, w którym ktoś kopiuje ich sól i hash do innego rekordu z zamiarem zastąpienia hasła własnym.

(co prawda trudno wymyślić okoliczności, w których to dotyczy, ale nie widzę szkody w paskach i szelkach, jeśli chodzi o Ochrona.)

 7
Author: teedyay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 13:34:18

Jeśli sól jest znana lub łatwo zgadywalna, nie zwiększyłeś trudności ataku słownikowego. Możliwe jest nawet stworzenie zmodyfikowanego tęczowego stołu, który bierze pod uwagę" stałą " sól.

Używanie unikalnych soli zwiększa trudność masowych ataków słownikowych.

Posiadanie unikalnej, kryptograficznie silnej wartości soli byłoby idealne.

 3
Author: HUAGHAGUAH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 13:21:57

Powiedziałbym, że dopóki sól jest inna dla każdego hasła, prawdopodobnie będzie ok. Chodzi o to, że nie można użyć standardowej tabeli tęczowej do rozwiązania każdego hasła w bazie danych. Jeśli więc zastosujesz inny salt do każdego hasła (nawet jeśli nie jest to losowe), atakujący będzie musiał w zasadzie obliczyć nową tęczową tabelę dla każdego hasła, ponieważ każde hasło używa innego salt.

Używanie soli z większą entropią nie pomaga w niczym, ponieważ w tym przypadku zakłada się, że osoba atakująca posiada już bazę danych. Ponieważ musisz być w stanie odtworzyć hash, musisz już wiedzieć, co to jest sól. Musisz więc przechowywać sól lub wartości, które składają się na sól w Twoim pliku. W systemach takich jak Linux, metoda uzyskiwania soli jest znana, więc nie ma sensu mieć tajemnej soli. Musisz założyć, że atakujący, który ma twoje wartości hash, prawdopodobnie zna również twoje wartości salt.

 3
Author: Kibbee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 13:51:40

Siła funkcji hash nie jest określona przez jej wejście!

Użycie soli, która jest znana atakującemu, oczywiście uatrakcyjnia tworzenie tęczowej tabeli (szczególnie dla ciężko zakodowanych nazw użytkowników, takich jak root ), ale nie osłabia hash. Użycie soli nieznanej atakującemu sprawi, że system będzie trudniejszy do ataku.

Konkatenacja nazwy użytkownika i hasła może nadal stanowić wpis dla inteligentnej tęczowej tabeli, więc użycie soli serii pseudolosowych znaków, przechowywanych z hashowanym hasłem jest chyba lepszym pomysłem. Jako ilustrację, gdybym miał nazwę użytkownika "potato" i hasło "beer", konkatenowane wejście dla Twojego hasha jest "potatobeer", co jest rozsądnym wpisem dla tęczowej tabeli.

Zmiana salt za każdym razem, gdy użytkownik zmienia swoje hasło, może pomóc w pokonaniu długotrwałych ataków, podobnie jak egzekwowanie rozsądnej polityki haseł, np. mieszana wielkość liter, interpunkcja, Długość min, zmienić po N tygodniach.

Jednak powiedziałbym, że wybór algorytmu digest jest ważniejszy. Użycie SHA-512 okaże się bardziej bolesne dla kogoś generującego Tęczowy stół niż MD5, na przykład.

 3
Author: David Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 14:58:56

Salt powinien mieć jak najwięcej entropii, aby zapewnić, że jeśli dana wartość wejściowa zostanie zahaszowana wielokrotnie, otrzymana wartość będzie, jak najbliżej, zawsze inna.

Używanie ciągle zmieniających się wartości soli z jak największą entropią w soli zapewni, że prawdopodobieństwo hashowania (np. hasło + sól) wytworzy zupełnie inne wartości hashowania.

Im mniej entropii w soli, tym większa szansa na wytworzenie tej samej soli wartość, ponieważ tym bardziej masz szansę na wygenerowanie tej samej wartości hash.

Natura wartości hash jest "stała", gdy dane wejściowe są znane i "stała", które pozwalają atakom słownikowym lub tablicom tęczowym być tak skuteczne. Zmieniając otrzymaną wartość skrótu tak bardzo, jak to możliwe (używając wysokiej wartości entropii soli) zapewnia, że hashowanie tego samego wejścia+random-salt spowoduje wiele różnych wyników wartości skrótu, tym samym pokonując (lub co najmniej znacznie zmniejszając skuteczność) ataków rainbow table.

 1
Author: CraigTP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 13:06:36

Entropia jest punktem wartości soli.

Jeśli za solą kryje się jakaś prosta i powtarzalna "Matematyka", to znaczy, że soli nie ma. Samo dodawanie wartości czasu powinno być w porządku.

 -1
Author: dmajkic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 12:40:59