Pytanie:
Czy nikt nie przechowuje soli?
jazzpi
2016-07-15 14:33:58 UTC
view on stackexchange narkive permalink

Rozmawialiśmy dzisiaj na zajęciach o haszowaniu i soleniu haseł. Nasz profesor miał zupełnie inne zrozumienie przypadku użycia soli od mojego i powiedział, że możesz nie przechowywać soli w ogóle i po prostu sprawdzać każdą próbę logowania ze wszystkimi możliwymi solami i autoryzować, jeśli jedna pasuje.

I nie widzę w tym żadnego sensu, ponieważ teraz moja usługa jest znacznie bardziej podatna na ataki brute force (wyślij jedno hasło, serwer sprawdza wiele), ale wydaje mi się, że jest trochę bardziej bezpieczny dla ataków słownikowych przeciwko zaszyfrowanemu hasłu.

Czy jest więc przypadek użycia, w którym ludzie faktycznie by to zrobili?

Biorąc pod uwagę długość soli, może to spowodować bardzo długą (niepraktyczną) operację logowania, jeśli będziesz musiał wypróbować wszystkie możliwe wartości soli.Spowoduje to użycie mniejszego zakresu soli ze względu na użyteczność.Myślę, że może to prowadzić do gorszego bezpieczeństwa niż użycie ważnej wartości soli i jej przechowywanie.Zobacz także https://stackoverflow.com/questions/184112/what-is-the-optimal-length-for-user-password-salt, aby zapoznać się z dyskusją na temat idealnej długości soli, sugerując od 16 do 256 bitów.
Zdecydowanie.Użyliśmy 12-bitowej soli, więc tylko 4096 prób, ale dłuższe sole oznaczają nie tylko dłuższy czas logowania, ale także gorsze bezpieczeństwo, ponieważ serwer próbuje uwierzytelnić Cię za pomocą 2 ^ n haseł zamiast tylko jednego.
Tylko czego ten facet jest profesorem?Stomatologia?
Należy zauważyć, że dobry hash kryptograficzny jest z założenia * powolny *, więc zakres możliwych wartości soli bardzo szybko staje się zbyt duży.
Dlatego ludzie powinni uczyć się od Stack Exchange zamiast od profesorów.:-)
Jeśli twój proces logowania obejmuje brutalne wymuszanie ... robisz to źle **.Jedyna różnica między niestosowaniem soli (okropny pomysł) a wypróbowaniem całej soli (okropny pomysł) jest taka, że będzie ona dużo bardziej kosztowna obliczeniowo (wkurzaj użytkowników).
AFAIK przechowywanie soli jest złym pomysłem, jeśli baza danych znajduje się w wilgotnym miejscu - prowadzi do korozji (zobacz przykład skorodowanej tabeli w Second Life [tutaj] (https://slm-assets0.secondlife.com/assets/1123356/lightbox / 65b45b42685a44ca64e556f353d48e4e.jpg? 1277194741)).
Założyłem, że to na Cooking.SE, kiedy zobaczyłem to w HNQ, zanim zauważyłem małą ikonę „InfoSec”: D
@oɔɯǝɹ: Ogólna kryptograficzna funkcja skrótu powinna być _fast_ zgodnie z projektem.Dlatego ogólne funkcje skrótu nie powinny być używane do mieszania haseł!
AilizegcynCMT Haha, ja też.
Twój profesor powinien przeczytać: http://stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/1645190#1645190
@CaffeineAddiction: „Jedyna różnica między niestosowaniem soli (okropny pomysł) a wypróbowaniem całej soli (okropny pomysł) jest taka, że będzie ona dużo bardziej kosztowna obliczeniowo (wkurzyć użytkowników)”. Właściwie wypróbowanie wszystkich soli jest jeszcze gorsze, ponieważ teraz (w przypadku jazzpi) prawdopodobieństwo wystąpienia kolizji haszyszu jest 4096 razy większe.Posiadanie ultra-bezpiecznego hasła nie ma znaczenia, jeśli ten sam skrót jest generowany przez słowo słownikowe z inną solą.Zapomnij o brutalnej sile w oparciu o znane dane;w rzeczywistości sprawia to, że Twoja aplikacja jest mniej bezpieczna bez żadnych znanych danych.
nieco poza tematem zalecenie.Najpierw potwierdź, że to, co tu napisałeś, jest w rzeczywistości tym, co powiedział profesor.Jeśli tak, proponuję skontaktować się z dziekanem swojej szkoły i zapytać o przeniesienie / zwrot pieniędzy.Ta osoba nie ma kwalifikacji do nauczania tej klasy.
Czy twój profesor może po prostu powiedzieć, że można nie przechowywać soli, ale nie powiedział, że to dobry pomysł?
@Shadur Prawdopodobnie komedia.
Czy jest możliwe, że jest tu jakieś zamieszanie z użyciem pieprzu?- czyli sól znana aplikacji, ale nie przechowywana wraz z hasłami w bazie danych?
@Jedi, boy Naprawdę zajęło mi to dużo czasu.:) Na początku całkowicie to przeoczyłem.
Twój profesor brzmi tak, jakby nie miał pojęcia, o czym mówią.Byłoby zabawne, gdybyś zapytał, co myśli o dodaniu kofeiny przed haszowaniem.
Dziewięć odpowiedzi:
Gudradain
2016-07-15 17:29:34 UTC
view on stackexchange narkive permalink

Nie przechowywanie soli to zła rada.

Głównym celem soli jest to, że każde hasło użytkownika musi być atakowane indywidualnie.

Jeśli nie przechowujesz soli, wtedy , jak powiedziałeś, musisz wypróbować każdą kombinację soli, aby zweryfikować hasło. Jeśli musisz sprawdzić każdą kombinację soli, oznacza to, że sól nie może być zbyt długa (wspomniałeś w komentarzu o 12 bitach). Jeśli sól nie jest długa, oznacza to, że sól będzie powtarzana dla wielu użytkowników. Jeśli powtórzy się to dla wielu użytkowników, oznacza to, że atakujący będzie mógł zaatakować wielu użytkowników w tym samym czasie, co pozwoli mu zaoszczędzić czas.

W ten sposób prawie całkowicie pokonujesz cel używania sól.

czy nie otworzyłoby to również możliwości większej liczby kolizji i znacznie większej liczby fałszywych alarmów?
@CaffeineAddiction Może.Na przykład może się zdarzyć: hash (zła sól + złe hasło) = hash (prawidłowa sól + prawidłowe hasło).Ale nie jest to praktyczna droga do ataku, ponieważ tworzenie kolizji w funkcji skrótu jest dość trudne.
@CaffeineAddiction: mało prawdopodobne.Zakładając SHA-256 i 32-bitową sól, twoje szanse na kolizję z istniejącym hashem (czyli drugim przedobrazem) wzrosły z 2 ^ -256 do 2 ^ -224.Większy, ale wciąż nieskończenie mały w ogólnym planie rzeczy.
@David jak?Funkcje skrótu można modelować jako losowe wyrocznie, w których dowolne dwa wejścia prowadzą do niezależnych wyjść, więc nie sądzę, aby prawdopodobieństwo w ogóle się zmieniło (chyba że wprowadzisz dane wejściowe do stałej długości)
@Thomas: tak, ale jeśli system spróbuje 2 ^ 32 soli, prawdopodobieństwo każdego zderzenia pozostaje takie samo, ale całkowite prawdopodobieństwo * dowolnej * kolizji powinno zostać zmniejszone o 2 ^ 32.
@Thomas Masz jeden skrót wygenerowany z ` `.Za każdym razem, gdy użytkownik wprowadza swoje hasło, serwer sprawdza Twoje hasło w połączeniu z 2 ^ 32 możliwymi solami.Jeśli na przykład używasz 32-bitowego hasha, oznaczałoby to, że twoje prawdziwe hasło zadziała, ale byłaby również doskonała szansa, że hash będzie pasował do jednego z 2 ^ 32 wypróbowanych przez serwer, jeśli wprowadzisz _dowolne_ hasło.
@David Zapomniałeś o lekcji paradoksu urodzinowego.Przypadkowe procesy zderzają się znacznie częściej niż to.W rzeczywistości kursy wahają się od 2 ^ -256 do 2 ^ -193.I to z jednym użytkownikiem.W miarę dodawania użytkowników rośnie dość szybko.Jednak wciąż jest dość malutki.
Pamiętaj, że atakujący wygrywa także fałszywe alarmy.Jeśli znajdą inne hasło, które działa z inną solą, mogą go użyć.Ponieważ wypróbowano wszystkie sole, nadal mogą zostać uwierzytelnione.
@AaronDufour, paradoks urodzin dotyczy tylko sytuacji, gdy szukasz kolizji w zbiorze danych.To bardziej przypomina atak przedobrazowy - chcą dopasować stałą wartość.
amccormack
2016-07-15 19:14:41 UTC
view on stackexchange narkive permalink

„Sekretna” sól jest znana jako pieprz.

Z Wikipedii:

Pieprz można dodać do hasła w dodatek do wartości soli. Papryka pełni podobną rolę jak sól, jednak podczas gdy sól jest powszechnie przechowywana obok wartości mieszanej, aby coś można było zdefiniować jako pieprz, powinno spełniać jedno z następujących kryteriów, które ją definiują, bardziej starannie ukryty `` sekret '' niż wartość soli:

  • Pieprz jest trzymany oddzielnie od wartości do zaszyfrowania
  • Pieprz jest generowany losowo dla każdej wartości do zaszyfrowania (w ramach ograniczonego zestawu wartości) i nigdy nie jest przechowywany. Kiedy dane są testowane pod kątem zaszyfrowanej wartości dla dopasowania, odbywa się to poprzez iterację zestawu wartości ważnych dla pieprzu, a każda z nich jest z kolei dodawana do danych do testowania (zwykle przez dodanie sufiksu do danych), przed uruchomieniem kryptograficznej funkcji skrótu na połączonej wartości.

Zaletą pieprzu jest to, że atakujący musi teraz odgadnąć do liczby możliwych permutacji wartości pieprzu dla każdego wpisu w postaci zwykłego tekstu.

Papryka zwiększa długość ataku dla określonego skrótu, podczas gdy sól nie.

Pamiętaj, że sól jest skutecznym złagodzeniem dla wstępnie obliczonych skrótów i sprawia, że atakujący spędza dużo czasu na atakowaniu zestawu skrótów. Jeśli jednak chodzi tylko o jeden hash i nie ma być używany żaden wstępnie obliczony hash, sól nie wydłuża czasu ataku. Jednak Pepper zmusza atakującego do wielokrotnego odgadnięcia dla każdego hasła w postaci zwykłego tekstu, nawet dla jednego skrótu.

W ten sposób pieprz jest podobny do rozciągania klawiszy.

Większość implementacji preferuje rozciąganie klucza niż pieprz.

Z mojej osobistej obserwacji wynika, że ​​większość implementacji woli rozciąganie klawiszy od papryki. Nie mam odniesienia do tego, więc czytelnicy mogą podawać w komentarzach odniesienia wspierające lub przeciwne. Ludzie wolą rozciąganie klucza, ponieważ ma znane i oczekiwane korzyści w zakresie wydajności i bezpieczeństwa. Aby obliczyć N-tą rundę skrótu, należy obliczyć N haszów. Jednak za pomocą pieprzu można obliczyć tylko oczekiwaną liczbę prób. Rozważmy 1-bajtowy pieprz, atakujący potrzebowałby 256 prób, aby odgadnąć wszystkie możliwe kombinacje, ale wartość oczekiwana to 128, a atakujący mógłby (średnio 1/256 razy) odgadnąć wartość na pierwsza próba.

Papryka i rozciąganie klawiszy mogą działać przeciwko sobie.

Rozciąganie klawiszy jest efektywne, ponieważ można ustawić liczbę rund na podstawie czasu, w którym obliczenie skrótu ma być brać. Załóżmy, że chcesz, aby pojedynczy test trwał pół sekundy na bieżącym sprzęcie, po prostu zwiększaj liczbę rund, aż to nastąpi.

Jeśli chodzi o pieprz, ponieważ musisz odgadnąć wiele wartości dla każdego hasła, rozmiar pieprzu musi być odwrotnie proporcjonalny do liczby rund, aby utrzymać stały czas obliczeń.

Praktyczne porady dotyczące implementacji haszowania

Najlepszą radą przy implementacji haseł / haszowania jest użycie dobrze znanych metodologii i przetestowanych bibliotek. Powinieneś używać bcrypt lub pbkdf2 z unikalną solą i wieloma rundami. Te algorytmy mają zwykle dobrze znane implementacje w wielu językach i strukturach. Jeśli zdarzy ci się znaleźć dobrze znaną i przetestowaną bibliotekę, która zawiera pieprz, oprócz soli i rozciągania klawiszy, może warto poświęcić trochę czasu, ale dodatkowe korzyści często przewyższają koszty wydajności.

czy nie otworzyłoby to również możliwości większej liczby kolizji i znacznie większej liczby fałszywych alarmów?
@CaffeineAddiction Muszę przyznać, że nie znam matematyki stojącej za tymi algorytmami haszującymi na tyle dobrze, aby udowodnić, że użycie pieprzu zwiększy lub zmniejszy kolizje.To dobre pytanie, a lepszą odpowiedź możesz uzyskać na [crypto.se] (http://crypto.stackexchange.com/).Myślę, że prawdopodobnie nie zwiększyłoby to kolizji do żadnej znaczącej ilości, gdybyś 1) użył wystarczająco dużego algorytmu haszującego, takiego jak SHA-256 lub wyższy, a 2) użył mniejszego rozmiaru pieprzu (mniej niż 2 bajty).
Papryka jest nadal przechowywana (nie jest widoczna, ale przechowywana)
@WoJ Drugi punkt w artykule na Wikipedii wskazuje, że papryki nie można przechowywać.Próbowałem znaleźć lepsze odniesienie niż wikipedia opisujące pieprz, ale nie byłem w stanie go znaleźć.Jeśli znasz odniesienie sugerujące, że pieprz jest przechowywany, z przyjemnością go obejrzę.
@amccormack: Przepraszam, nie czytałem artykułu w Wikipedii.To powiedziawszy, nigdy nie widziałem takiej implementacji pieprzu (widziałem ich ograniczoną ilość).To byłby koszmar, aby sprawdzić, czy algorytm haszowania jest poprawny (powolny, wielorundowy).
@Woj, Zgadzam się, testowanie byłoby koszmarem i prawdopodobnie spowodowałoby zmniejszenie liczby rund dla dowolnego rozciągania klucza.Przechowywanie soli (lub obliczanie jej w sposób deterministyczny) złagodziłoby negatywny wpływ na rozciąganie klucza i mogłoby złagodzić niektóre przypadki, w których wyciekają tylko wartości hash + salt.
Jak zawsze słyszałem definicję „pieprzu”, jest to sól przechowywana w kodzie na aplikację, a nie na użytkownika w bazie danych.
Warto zauważyć, że papryka jest nadal przechowywana, ale niekoniecznie w bazie danych.Wydaje się, że OP mówi o przypadku, w którym sól w ogóle nie jest przechowywana, a aplikacja w zasadzie brutalnie wymusza sól za każdym razem, gdy próbuje się zalogować ...
@Ajedi32 Dziękuję za zwrócenie uwagi.Inni również to zauważyli, ale nie mogę znaleźć ostatecznego źródła, które by to twierdziło.Gdybyś mógł mi wskazać jeden, byłbym wdzięczny.
@amccormack Nie jestem pewien ostatecznego źródła, ale prawie każdy artykuł lub post, który przeczytałem o papryce, wydaje się mieć tę definicję.http://security.stackexchange.com/q/3272/29865 http://stackoverflow.com/q/16891729/1157054 https://blog.filippo.io/salt-and-pepper/ A poza tym nie przechowywaniepieprz byłby całkiem bezużyteczny - byłby po prostu naprawdę hackowym sposobem na zwiększenie współczynnika pracy funkcji skrótu.
Odniesienia dotyczące definicji słowa „pieprz” są omówione na stronie crypto.SE: [Czy istnieje autorska definicja terminu kryptograficznego „pieprz”?] (Https://crypto.stackexchange.com/q/24698/23581), [Definicja „pieprzu” w funkcjach skrótu] (https://crypto.stackexchange.com/q/20578/23581).Doceniam odpowiedź udzieloną w tym drugim przypadku, w którym pieprz jest najczęściej definiowany jako dodatkowy sekret nieznany atakującemu i nie obchodziłoby nas, czy ten sekret jest zakodowany na stałe / zakodowany / itp.o ile pozostaje nieznany atakującemu.
@Ajedi32,, kiedy zadałem to pytanie, termin „pieprz” nie był w ogóle powszechnie używany, ale nie wymyśliłem tego terminu, przeczytałem go gdzieś w gazecie kilka lat wcześniej.
Myślałem, że pieprz to sól do aplikacji przechowywana poza bazą danych.
Ciekawą rzeczą w przypadku papryki jest to, że testowanie wartości dla papryki można przeprowadzić równolegle, ale stosowanie większej liczby rund haszowania musi być wykonywane sekwencyjnie.
należy również wspomnieć o scrypt (https://en.wikipedia.org/wiki/Scrypt) jako rozsądnej alternatywie.
* „może warto poświęcić trochę czasu na jego użycie, ale dodatkowe korzyści często przewyższają koszty wydajności”. * Czy słowo ** „ale” ** jest literówką w tym zdaniu, czy też coś nie rozumiem?Wydaje się, że powinno być napisane „ponieważ”.
Bryan Field
2016-07-15 18:37:58 UTC
view on stackexchange narkive permalink

Tło: powinieneś używać powolnego skrótu hasła. (tj. bcrypt) Przez „powolne” mam na myśli kosztowne obliczeniowo, wymagające ponad 100 ms (na twoim sprzęcie) z ochroną DoS * na przetestowanie pojedynczego hasła. Ma to na celu zwiększenie mocy obliczeniowej potrzebnej (na sprzęcie atakującego) do znalezienia hasła brutalną siłą, gdyby hash został skradziony.

Unikalna sól dla użytkownika jest wysoce zalecana. (w przypadku bcrypt jest on generowany automatycznie) Sól powinna być wysoce unikalna (tj. długa losowa &), ale nie tajna . Używanie unikalnej soli oznacza, że ​​atakujący musiałby wykonać oddzielne zadanie brutalnej siły dla każdego użytkownika .

Gdyby nie było „soli”, atakujący mógłby natychmiast użyć Rainbow Table i żadnej brutalnej siły.

Jeśli używasz tylko „wspólnej soli”, osoba atakująca może złamać hasła wszystkich użytkowników za pomocą jednego brutala wymuś Hioba. (nie tak szybki jak tęczowy stół, ale wciąż znacznie łatwiejszy niż osobna praca brutalna dla każdego z nich)


Odpowiedź: Gdybyś nie przechowywał sól („brutalnie wymuś hash w czasie wykonywania”, jak sugeruje twój profesor)

  • możliwych soli musiałoby być bardzo mało
  • wartość hash musiałaby być całkiem sporo szybciej

To całkowicie zniweczyłoby cel soli, poważnie osłabiając korzyści płynące z Slow hash. To poważny błąd projektowy pana profesora. Zasadniczo rozwija swój własny schemat przechowywania haseł, w którym powinien używać dobrze sprawdzonego algorytmu bcrypt (lub scrypt lub PBKDF2) zgodnie z przeznaczeniem .


* Jak skomentował @Navin, byłby to potencjalny wektor ataku DoS. Jednym z rozwiązań jest ograniczenie liczby godzinowych prób na adres IP i na nazwę użytkownika. Możliwe jest również, że powinieneś zmniejszyć „powolność” swojego haszyszu do zaledwie 10 ms. To nie jest tak dobre jak 100 ms z perspektywy „skradzionego skrótu”, ale wciąż znacznie lepsze niż „mikrosekundy”.

„Gdyby nie było soli, osoba atakująca mogłaby brutalnie wymusić skrót dla wszystkich użytkowników w jednym zadaniu typu brute force. (Oszczędza w ten sposób dużo czasu)” Lub po prostu wybierz z bazy danych dla każdego użytkownika z hashem MD5 `5f4dcc3b5aa765d61d8327deb882cf99`, co odpowiada hasłu „hasło”.To także sposób na ochronę użytkowników przed sobą.
Nigdy nie używaj MD5 do przechowywania haseł!Zamiast tego użyj Slow Hash.Ale tak, rozumiem twój punkt widzenia.Zaktualizowałem odpowiedź, aby odnosić się do Rainbow Tables, do których się odnosisz.
Prawdziwe.W prawdziwym świecie powinieneś używać odpowiedniej biblioteki haszującej hasła w dowolnym języku, z którym pracujesz, która zwykle zawiera sól w ciągu skrótu, a także chroni przed atakami czasowymi, co sprawia, że cała dyskusja jest dyskusyjna.Ale tak, MD5 nie służy do haseł.
Steve Sether
2016-07-15 18:37:46 UTC
view on stackexchange narkive permalink

Twój profesor nie ma racji. Chodzi o to, aby zwiększyć entropię haszowanych haseł, aby zapobiec wszelkim atakom na nie przed obliczeniami, a także zapobiec temu, aby to samo hasło od różnych użytkowników miało tę samą wartość skrótu.

Możliwość wypróbowania wszystkich możliwych wartości soli oznacza, że ​​musisz mieć bardzo NISKĄ ilość entropii w soli, co oznacza, że ​​możliwe są obliczenia wstępne za pomocą tabel tęczowych.

Cort Ammon
2016-07-16 03:07:46 UTC
view on stackexchange narkive permalink

W ten sposób możesz użyć soli. Byłby to rodzaj procesu rozciągania haszyszu. Zwykle hasz jest rozciągany, powtarzając algorytm kilka tysięcy razy, co 1000-krotnie spowalnia atakujących i użytkowników, ale użytkownicy zazwyczaj nie mają nic przeciwko spowolnieniu. Użycie soli w ten sposób spowodowałoby wykonanie algorytmu rozciągania skrótu, ponieważ musiałoby powtarzać go dla wielu nieznanych wartości.

Jest to jednak niezwykle niezwykłe podejście. Tradycyjne metody solenia robią to, co powinny robić sole o wiele lepiej (spraw, aby nikt nie mógł wstępnie obliczyć tabeli haseł). Tradycyjne sposoby rozciągania skrótu robią to, co powinno dawać znacznie lepsze wyniki (sprawić, by obliczanie haseł zajęło atakującym więcej czasu). Używanie soli w ten sposób jest jakby zmiksowaniem ich obu razem. Rezultat jakby działa, ale czystsze podejścia dają oba rozwiązania dużo lepiej niż brzydka pomyłka technik.

supercat
2016-07-15 20:52:19 UTC
view on stackexchange narkive permalink

Zamiast myśleć o soli w kategoriach brutalnego wymuszania, wolę myśleć o niej w kategoriach stwierdzenia, że ​​nie można powiedzieć nic o haśle, w tym o jego związku z innymi hasłami, patrząc na nie. Jeśli system nie używa haseł, sprawdzenie zaszyfrowanych haseł dwóch użytkowników wskazałoby, czy ich prawdziwe hasła są zgodne. Jeśli system wykorzystywał tylko nazwę użytkownika, ale nic losowego, określonego w czasie ani specyficznego dla systemu, to sprawdzenie zaszyfrowanych haseł użytkownika na dwóch maszynach, które stosują to samo podejście, wskaże, czy hasła użytkownika na dwóch komputerach są zgodne. Jeśli system posłuży się identyfikatorem systemu i nazwą użytkownika, ale nie ma nic losowego ani określonego w czasie, wówczas ktoś, kto ma dostęp do dwóch różnych skrótów haseł tego samego użytkownika, może stwierdzić, czy powiązane hasła są zgodne.

Efekt losowe solowanie ma na celu zapewnienie, że żadne dwa skróty używające tego samego hasła nie będą pasować, nawet jeśli dotyczą tego samego użytkownika w tym samym systemie. Chociaż można by osiągnąć podobny efekt bez przechowywania soli, gdyby próby logowania miały na celu ich brutalne wymuszenie, takie podejście ograniczyłoby praktyczną długość soli, której można by użyć, a tym samym zwiększyłoby prawdopodobieństwo, że hasła używane w dwóch kontekstach miałyby taką samą sól i dzięki temu będzie rozpoznawalny jako pasujący.

Jason Goemaat
2016-07-18 07:24:21 UTC
view on stackexchange narkive permalink

Co daje solenie? Atakujący mają wstępnie obliczone bazy danych wartości skrótu dla haseł, wspólnych i nie. Jeśli przechwytują twoją bazę danych i mają skrót haseł dla każdego użytkownika, łatwo jest porównać ich skróty z tymi wartościami bez soli.

Z losową solą przechowywaną wraz z hasłem, to szalenie metoda szybka nie jest już możliwa. Ale jeśli atakujący ma zarówno sól, jak i hash, nadal można używać ataków słownikowych w przypadku słabych haseł lub brutalnego forsowania w przypadku krótkich. Atakujący musi tylko użyć soli i wypróbować różne hasła za pomocą słownika lub ataku brute-force.

Teraz powiedzmy, że kiedy hasło jest zmieniane, haszujesz je losową 12-bitową wartością, która jest To znaczy nie jest przechowywane razem z solą. Następnie za każdym razem, gdy sprawdzasz hasło, musisz wypróbować wszystkie 4096 wartości. Na moim komputerze zajmuje to około 3,5 ms, więc co sekundę można sprawdzić 284 hasła. Trochę więcej wykorzystania procesora na serwerze, gdy ktoś się loguje, ale dla kogoś, kto próbuje ataków słownikowych lub brutalnej siły, po prostu utrudniłeś mu pracę, nawet jeśli ma hash i sól.

Czy nie uczyniłbyś ich pracy znacznie łatwiejszą, gdyby * nie * mieli haszyszu i soli?Od teraz serwer sprawdza 4096 wartości, jeśli przesyłam tylko jedną, co daje znacznie więcej fałszywych alarmów.To było rozumowanie, którego użył mój profesor, ale nie wydaje mi się to zbyt przydatne, więc chciałbym zobaczyć kogoś, kto faktycznie używa tego podejścia w kodzie w świecie rzeczywistym.
Jeśli nie mają haszyszu, nie ma sensu, prawda?Solenie chroni przed ludźmi, którzy mają haszy.Jeśli użycie 12-bitowej liczby stanie się popularne, osoby atakujące mogą tworzyć bazy danych z wstępnie obliczonymi skrótami dla każdej z tych liczb i typowymi / nietypowymi hasłami, aby ułatwić sobie pracę.Nawet jeśli wygenerujesz 4096 losowych soli i użyjesz ich ponownie zamiast prostej 12-bitowej liczby, pozwoliłoby im skupić się na jednej wartości soli i prawdopodobnie zagrozić wielu użytkownikom, jeśli masz miliony.
Tak, solenie chroni przed ludźmi, którzy mają haszy.Zwykle nie sprawia to, że jesteś * bardziej podatny * na osoby, które nie mają skrótów, ale robi to z tym wariantem.
Jak to sprawia, że jesteś * bardziej * bezbronny?
Ponieważ jeśli wyślesz jedno hasło do serwera, musi on sprawdzić je ze wszystkimi 4096 możliwymi solami, co daje znacznie większy potencjał fałszywych alarmów.
Wygląda na to, że mówisz o kolizji algorytmu haszującego z próbowaniem losowych haseł.Jeśli masz 256-bitowy hash, te 4096 prób jest prawie bez znaczenia podczas próby wytworzenia kolizji.Powodem, dla którego możesz brutalnie wymusić _ gdy masz hash_, jest to, że możesz uruchamiać miliony lub miliardy czeków w każdej sekundzie na swoim lokalnym komputerze (ach).Jeśli Twoja witryna umożliwia ludziom próbowanie milionów haseł bez ich blokowania, (A) robisz to źle i (B) muszą mieć bardzo szybkie połączenie z Twoimi serwerami i (C) powinieneś zauważyć, że procesory Twojego serwera sąustalony.
Kaz
2016-07-16 04:08:03 UTC
view on stackexchange narkive permalink

Wydaje się, że pomysł nieprzechowywania pewnej kontrolowanej liczby bitów soli, która jest niezależnie konfigurowana i niezależna od rozmiaru soli, ma jakąś wartość.

Załóżmy, że mamy 32-bitowe sole. Mogliśmy zdecydować się na przechowywanie tylko 22 bitów i brutalnej siły przez pozostałe 10 podczas uwierzytelniania. Efekt jest taki, jakby do funkcji haszującej dodano więcej rund. Nie tak wiele, że ma to wpływ na legalne uwierzytelnianie, ale wystarczająco dużo, aby zwiększyć trudność łamania brutalnej siły.

W przyszłym roku maszyny będą szybsze. Więc przeglądamy bazę danych haseł i usuwamy trochę z każdej soli: teraz przechowujemy tylko 21 bitów i musimy brutalnie przesuwać się przez 11.

To tak, jakbyśmy podwoili siłę mieszania, ale bez zakłócenie zastępowania algorytmu i nakłanianie użytkowników do ponownego mieszania haseł (co jest pozostawione regularnej polityce wygaśnięcia hasła).

To podejście „stopniowego odrzucania soli” może wydłużyć żywotność funkcji mieszających.

Jednak tego rodzaju podejścia spowalniają legalne uwierzytelnianie i ataki brute force w równym stopniu, więc w najlepszym przypadku zapewniają mniejszą warstwę bezpieczeństwa. Powinniśmy skupić się na ulepszeniach, które dodają tylko stałą ilość dodatkowego czasu do legalnego użycia, jednocześnie zwiększając trudność pękania. Oczywiście ulepszeniem, które ma tę właściwość, jest zwiększenie ilości entropii w haśle! Każdy bit entropii dodany do hasła powoduje stały koszt dla uprawnionych użytkowników, ale podwaja wysiłek związany z brutalnym łamaniem hasła. Hasło o długości N wymaga O (N) do skrótu (i wpisania), ale O (2 ** N) do brutalnej siły. Dodanie 12 bitów entropii do hasła pokonuje ukrywanie 12 bitów soli.

„To„ stopniowe odrzucanie soli ”mogłoby przedłużyć żywotność funkcji mieszających”.Istnieją funkcje haszujące z konfigurowalnym rozmiarem skrótu (jednym z przykładów jest Keccak) i używanie ich jako podstawowego prymitywu KDF wydaje mi się o wiele lepszym pomysłem.Nadal możesz użyć tej techniki, aby przedłużyć żywotność nieaktualnych skrótów haseł (po aktualizacji nowy hash miałby ostatnio skonfigurowany rozmiar skrótu), ale wątpliwe jest również, czy to dobry pomysł.Przy każdym logowaniu zobaczysz zwykłe hasło użytkownika (z wyjątkiem np. SRP), więc możesz zaktualizować skrót.
@Rhymoid Musisz mieć uprawnienia do zapisu we wpisie bazy danych haseł, aby zaktualizować skrót w czasie uwierzytelniania (gdy hasło jest na krótko znane systemowi).Na przykład w klasycznym Uniksie każdy mógł czytać `/ etc / passwd` i używać skrótów do uwierzytelniania, ale tylko narzędzie` setuid` takie jak `/ bin / passwd` mogło je zaktualizować.(Ogólnie rzecz biorąc, możemy sobie wyobrazić system, w którym aktualizowanie wpisu bazy danych uwierzytelniania jest odrębnym przywilejem od używania go do uwierzytelniania, mimo że oba są specjalnymi uprawnieniami nadawanymi tylko niektórym programom).
coteyr
2016-07-21 18:54:13 UTC
view on stackexchange narkive permalink

Na wolności mamy tabelę użytkowników. Tabela użytkowników to zwykle

  ID | nazwa użytkownika | sól | zaszyfrowane_hasło | horridly_insecure_reset_key =================================================== ========================== 1 | użytkownik1 | foo | 09b6d39aa22fcb8698687e1af09a3af9 | NULL2 | użytkownik2 | bar | 6c07c60f4b02c644ea1037575eb40005 | NULL3 | użytkownik3 | baz | 09b6d39aa22fcb8698687e1af09a3af9 | reset  

Wtedy metoda uwierzytelniania będzie wyglądać mniej więcej tak:

  def authentication (user, password) u = User.find (user: user) return u. encrypted_password == encrypt (hasło + u.salt) end  

Posiadanie soli na użytkownika zapewnia, że ​​nawet jeśli znane jest hasło użytkownika 1, nie można znaleźć hasła użytkownika 2 lub użytkownik3 bez ich soli.

Aby upewnić się, że nie możesz rozwiązać problemu, masz zestaw zaszyfrowanych haseł i wypróbowując kilka zaszyfrowanych haseł.

W ten sposób każdy atak na użytkownik musi być uruchomiony od zera.

Nawet jeśli napastnik ma listę użytkowników i soli, nadal musi dokonać włamania do każdego użytkownika, aby sprawdzić, czy ma pasujące hasło. Gdybyś miał pulę soli lub jedną statyczną sól, mógłbym wiedzieć, że hasło użytkownika 1 to hasło, a następnie po prostu znaleźć wszystkie zaszyfrowane hasła, które pasują. Więc w ten sposób przynajmniej trochę je spowalnia.

Teraz, gdy patrzymy na sole, chcemy ograniczyć ponowne użycie soli. Dwie identyczne sole ułatwią napastnikom. Jeśli dwie osoby mają tę samą sól i to samo hasło, złamanie jednego użytkownika spowoduje złamanie drugiego.

Powiedzmy, że używamy tylko tych trzech soli. Mamy 3000 użytkowników. oznacza to, że 1000 osób ma tę samą sól. Jeśli 1% z nich ma hasło „hasło”, wówczas wszystkie te osoby mogą zostać złamane w tym samym czasie. 10 kont zostaje zhakowanych jednocześnie. Ponieważ znamy te trzy sole. To bardzo łatwy odcinek, aby zaatakować 30 osób jednocześnie.

Teraz, jeśli każda sól jest wyjątkowa. Wiemy, że hasło użytkownika 1 to hasło, ale to nic nie da. Nadal złamałeś tylko 1 użytkownika. Nadal musisz zrobić „czy hasło + sól = zaszyfrowane hasło” dla wszystkich pozostałych 2999 użytkowników.

Naprawdę ważna uwaga.

Bezpieczeństwo poprzez zaciemnienie to nie bezpieczeństwo. To nie znaczy, że powinieneś publikować tabelę użytkowników w Google, bo to głupie. Jednak mierząc poziom bezpieczeństwa, należy założyć, że osoba atakująca ma wszystko. Nie możesz powiedzieć: „Ale oni nie będą znali soli aplikacji, ponieważ nie mają kodu źródłowego”. Bo mogli. Nie oznacza rozdawania soli, po prostu oznacza, że ​​nie jest to prawdziwe zabezpieczenie. Załóżmy, że mają nazwę użytkownika i sól, a następnie spróbuj utrudnić im uzyskanie hasła.

BARDZO WAŻNA UWAGA

użyty tutaj kod i tabela są około 9 000 razy zbyt proste do rzeczywistego użycia. Hasło nie jest zaszyfrowane, sole są zbyt krótkie, metoda jest trochę za uproszczona, w skrócie robienie czegoś takiego na produkcji nie jest czymś, co należy uznać za bezpieczne. Wybrałem te przyczyny, które są proste dla celów demonstracyjnych, a nie dlatego, że są bezpieczne.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...