Pytanie:
Dlaczego solone skróty są bezpieczniejsze do przechowywania haseł?
Tsyras
2014-02-21 02:58:40 UTC
view on stackexchange narkive permalink

Wiem, że toczy się wiele dyskusji na temat solonych haszów i rozumiem, że celem jest uniemożliwienie zbudowania tęczowej tablicy ze wszystkich możliwych haszów (zwykle do 7 znaków).

Moje zrozumienie polega na tym, że losowe wartości zasolone są po prostu łączone z hashem hasła. Dlaczego tablica tęczy nie może być używana przeciwko skrótowi hasła i ignorować pierwsze X bitów, o których wiadomo, że są losowym mieszaniem soli?

Aktualizacja

Dzięki za odpowiedzi. Domyślam się, że aby to zadziałało, katalog (LDAP itp.) Musi przechowywać sól specyficzną dla każdego użytkownika, inaczej wygląda na to, że sól została „utracona” i uwierzytelnianie nigdy nie mogłoby nastąpić.

Oprócz komentarza AJ, samo posolenie hasha nie wystarczy, aby zapewnić bezpieczne przechowywanie haseł. Nowoczesne algorytmy haszowania haseł, takie jak bcrypt i scrypt, wymagają znacznej ilości procesora i / lub pamięci, znacznie spowalniając zdolność atakującego do prób odgadnięcia.
Kilka lat temu napisałem serię artykułów odpowiadających na Twoje pytanie. http://blogs.msdn.com/b/ericlippert/archive/tags/salt/
I tak, sól jest przechowywana wraz z haszyszem, a sól powinna być na użytkownika.
Sól może być również solą globalną, połączoną z identyfikatorem użytkownika, a następnie zaszyfrowaną, aby utworzyć unikalną sól dla skrótu hasła użytkownika. W ten sposób nie musisz niczego przechowywać dla każdego użytkownika (co może zostać skradzione wraz z zaszyfrowanym hasłem ...)
Sól nie jest dodawana do haszyszu! Sól jest dołączana (lub dodawana na początku) do hasła * w postaci zwykłego * *, a sól i hasło razem są przekazywane do algorytmu haszującego w celu utworzenia skrótu. Dlatego możesz przechowywać sól bezpośrednio z wartością hash. Ale oczywiście zwykły solony haszysz, oprócz tego, że jest szkodliwy dla twojego serca, nie wystarcza już do bezpiecznego przechowywania referencji.
Jeśli sól też musi być gdzieś przechowywana (tak), to dlaczego jest faktycznie przydatna?W zasadzie to to samo, co hasło.
Osiem odpowiedzi:
tylerl
2014-02-21 11:11:42 UTC
view on stackexchange narkive permalink

Zwykle działa to tak:

Powiedz, że Twoje hasło to „baseball”. Mógłbym po prostu przechowywać to w stanie surowym, ale każdy, kto zdobędzie moją bazę danych, otrzyma hasło. Więc zamiast tego robię na nim hash SHA1 i otrzymuję to:

  $ echo -n baseball | sha1suma2c901c8c6dea98958c219f6f2d038c44dc5d362  

Teoretycznie niemożliwe jest odwrócenie skrótu SHA1. Ale idź wyszukaj w Google dokładnie ten ciąg, a nie będziesz mieć problemu z odzyskaniem oryginalnego hasła.

Ponadto, jeśli dwóch użytkowników w bazie danych ma to samo hasło, to będą mieć ten sam skrót SHA1. A jeśli jeden z nich ma wskazówkę do hasła, która mówi spróbuj „baseball” - cóż, teraz wiem, czym są oba hasła użytkowników.

Więc zanim go zhaszujemy, dołączamy unikalny ciąg. To nie jest sekret , po prostu coś wyjątkowego. A co z WquZ012C . Więc teraz haszujemy ciąg WquZ012Cbaseball . To oznacza to:

c5e635ec235a51e89f6ed7d4857afe58663d54f5

Przeszukanie w Google tego ciągu nic nie daje (z wyjątkiem być może tego strona), więc teraz coś jest. A jeśli person2 również używa „baseball” jako swojego hasła, używamy innej soli i otrzymujemy inny hash.

Oczywiście, aby przetestować swoje hasło, musisz wiedzieć, co to za sól. Więc musimy to gdzieś przechowywać. Większość implementacji po prostu umieszcza to w tym miejscu za pomocą skrótu, zwykle z pewnym ogranicznikiem. Spróbuj tego, jeśli masz zainstalowane openssl :

  [tylerl ~] $ openssl passwd -1Password: baseballVerifying - Password: baseball $ 1 $ oaagVya9 $ NMvf1IyubxEYvrZTRSLgk0  

To daje nam hash przy użyciu standardowej biblioteki crypt . Więc nasz skrót to $ 1 $ oaagVya9 $ NMvf1IyubxEYvrZTRSLgk0 : to w rzeczywistości 3 sekcje oddzielone $ . Zastąpię separator spacją, aby był bardziej przejrzysty:

  $ 1 $ oaagVya9 $ NMvf1IyubxEYvrZTRSLgk0 1 oaagVya9 NMvf1IyubxEYvrZTRSLgk0

Jeśli uruchomię proces znowu dostaję zupełnie inny haszysz z inną solą. W tym przykładzie istnieje około 10 14 sposobów przechowywania tego jednego hasła. Wszystkie z nich dotyczą hasła „baseball”:

  $ 1 $ 9XsNo9.P $ kTPuyvrHqsJJuCci3zLwL. $ 1 $ nLEOCtx6 $ uSnz6PF8q3YuUhB3rLTC3 / ​​$ 1 $ / jZJXTF3 $ WfDukpe. U $ KR0jkhpeb1sz.UIqvfYOR.  

Ale jeśli celowo określę sól, którą chcę sprawdzić, odzyskam oczekiwany wynik:

  [ tylerl ~] $ openssl passwd -1 -salt oaagVya9Hasło: baseballVerifying - Hasło: baseball $ 1 $ oaagVya9 $ NMvf1IyubxEYvrZTRSLgk0  

I to jest test, który przeprowadzam, aby sprawdzić, czy hasło jest poprawne. Znajdź przechowywany hash dla użytkownika, znajdź zapisaną sól, ponownie uruchom ten sam hash używając zapisanej soli, sprawdź, czy wynik jest zgodny z oryginalnym hashem.

Implementing This Yourself

Żeby było jasne, ten post nie jest przewodnikiem po implementacji. Nie posolaj MD5 i nie nazywaj go dobrym. To za mało w dzisiejszym klimacie ryzyka. Zamiast tego będziesz chciał uruchomić iteracyjny proces, który uruchamia funkcję haszującą tysiące razy. Było to wyjaśniane w innym miejscu wiele razy, więc nie będę tutaj omawiać „dlaczego” .

Jest kilka dobrze ugruntowanych i zaufane możliwości zrobienia tego:

  • crypt : Funkcja, której użyłem powyżej, jest starszą wersją mechanizmu haszowania haseł unix crypt wbudowanego we wszystkie Systemy operacyjne Unix / Linux. Oryginalna (oparta na DES) wersja jest strasznie niepewna; nawet o tym nie myśl. Ten, który pokazałem (oparty na MD5) jest lepszy, ale nadal nie powinien być używany. Późniejsze warianty, w tym warianty SHA-256 i SHA-512, powinny być rozsądne. Wszystkie najnowsze warianty implementują wiele rund haszów.

  • bcrypt : Wersja Blowfish crypt kod> wezwanie funkcjonalne wspomniane powyżej. Wykorzystuje fakt, że Blowfish ma bardzo kosztowny proces konfiguracji klucza i przyjmuje parametr „koszt”, który odpowiednio wydłuża czas konfiguracji klucza.

  • PBKDF2 : ("Funkcja wyprowadzania klucza opartego na haśle w wersji 2") Stworzona do tworzenia silnych kluczy kryptograficznych z prostych haseł, jest to jedyna wymieniona tutaj funkcja, która faktycznie ma RFC. Uruchamia konfigurowalną liczbę rund, a każda runda haszuje hasło i wynik poprzedniej rundy. Pierwsza runda używa soli. Warto zauważyć, że jego pierwotnym przeznaczeniem jest tworzenie silnych kluczy , a nie przechowywanie haseł , ale nakładanie się celów sprawia, że ​​jest to również godne zaufania rozwiązanie. Jeśli nie miałeś dostępnych bibliotek i byłeś zmuszony do implementacji czegoś od zera, jest to najłatwiejsza i najlepiej udokumentowana opcja. Chociaż, oczywiście, korzystanie z dobrze sprawdzonej biblioteki jest zawsze najlepsze.

  • scrypt : niedawno wprowadzony system zaprojektowany szczególnie trudne do wdrożenia na dedykowanym sprzęcie. Oprócz wymagania wielu rund funkcji mieszającej, scrypt ma również bardzo duży stan pamięci roboczej, aby zwiększyć zapotrzebowanie na pamięć RAM dla implementacji. Chociaż jest bardzo nowy i w większości niesprawdzony, wygląda co najmniej tak samo bezpieczny jak inne i prawdopodobnie najbezpieczniejszy z nich wszystkich.

Najlepsze, najjaśniejsze i najpełniejsze wyjaśnienie skrótów, jakie widziałem. Planuję * bezwstydnie * używać go na zajęciach z bezpieczeństwa.
Więc, ściśle mówiąc, sól nie powinna być naprawdę * przypadkowa *, prawda? Na przykład oprogramowanie szyfrujące powinno śledzić już użyte sole i zapobiegać ich ponownemu użyciu? A może to w dużej mierze nieistotne?
@JeffGohlke Jeśli używasz 8-znakowej soli, która daje 62 ^ 8 lub ponad 218 * bilionów * możliwych soli. I chcesz się tylko upewnić, że nie użyjesz * tej samej soli dla tego samego hasła * dwa razy. Więc nie, realistycznie nie musisz martwić się ponownym użyciem soli.
@AdamBalsam Ma sens. Myślę, że w przeszłości widziałem tylko dwie sole postaci, patrząc na te rzeczy.
Czy mógłbyś dodać ostatni akapit na temat rozciągania klawiszy i używania odpowiedniego KDF, w przeciwnym razie ten post spowoduje pojawienie się jeszcze więcej schematów `sha1 (sól || pwd)` przez użytkowników, którzy przeczytali tylko tę odpowiedź i zrobili swoje. Wiem, że technicznie nie jest to temat, ale naprawdę musimy z tym walczyć, starając się nie sugerować bezpośredniego użycia tego.
* „Dodatkowo, jeśli dwóch użytkowników w bazie danych ma to samo hasło, to będą mieli ten sam skrót SHA1.” * Dodając do tego, zachowuje on między bazami danych, które używają tego samego niesolonego algorytmu (być może użytkownik używa tego samego hasła w wiele systemów). Jest to również niezależne od algorytmu skrótu; nawet całkowicie niestandardowy lub hipotetyczny algorytm niemożliwy do złamania nie powstrzymałby napastnika przed sprawdzeniem, którzy użytkownicy mają to samo hasło, jeśli nie jest używane salting.
Przyszedłem tutaj, przeczytałem odpowiedź, wyszukałem w Google c5e635ec235a51e89f6ed7d4857afe58663d54f5 i wróciłem tutaj! :) +1
Użyłem SHA1 do haszowania haseł raz, kiedy pracowałem nad aplikacją, aby zapewnić zgodność z PA-DSS. Przechowywałem sól dla każdego użytkownika w kolumnie o nazwie sól i była to po prostu losowa pięciocyfrowa liczba. Jeśli użytkownik zmienił hasło, wygenerowałem nową sól. Audytor powiedział, że to bezpieczne.
@0A0D dzisiaj prawdopodobnie nie zostałby uznany za bezpieczny. Zaktualizowałem swoją odpowiedź, aby uwzględnić opcje, które są dzisiaj zalecane.
@tylerl: To było zaledwie kilka lat temu!
@0A0D Szybkie czasy! `:)` Właściwie twój system prawdopodobnie przejdzie audyt PCI-DSS z obecnym standardem. Wymaganie silnego haszowania w PCI byłoby katastrofalne dla administratorów systemu Windows, którzy nie mogą decydować, w jaki sposób hasła do kont są szyfrowane w ich systemach.
@tylerl: Ach, cóż, to była niestandardowa aplikacja (stąd PA-DSS nie PCI-DSS). Ale rozumiem twój punkt widzenia.
Należy pamiętać, że PBKDF2 jest również jedynym wspólnym algorytmem haszowania haseł, który może używać [FIPS 140-2] (http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf) / [NIST SP 800-131A ] (http://csrc.nist.gov/publications/nistpubs/800-131A/sp800-131A.pdf) wymienił funkcje skrótu jako jego prymityw mieszający, jeśli te dokumenty są uważane za wytyczne dla Twojej branży lub zastosowania.
bardzo ładna odpowiedź. Zwróć uwagę, że jeśli ktoś martwi się ponownym użyciem soli, np. Przechowywaniem psw użytkownika, możesz użyć identyfikatora użytkownika jako soli, ponieważ nigdy się nie zmieni i jest unikalny.
Ciekawa strona, która pojawiła się, gdy wygooglowałem `c5e635ec235a51e89f6ed7d4857afe58663d54f5`: http://arehost.net:9090/encryption/index.php?search=c5e635ec235a51e89f6ed7d4857afe58663d54f5&sub=Send!
@AdamBalsam: Nie, ktoś chce się upewnić, że _ ta sama sól nie jest używana dwukrotnie_, aby ataki na wiele celów nie były (miejmy nadzieję) szybsze niż po prostu samodzielne atakowanie hashe'ów.
@asteri: Zobacz mój poprzedni komentarz.
Ojej, to po prostu piękne.
Dziękuję za to wyjaśnienie.Koncepcja, z którą miałem problem, polega na tym, że sól jest łączona z HASŁEM, a nie z hashem, a następnie hashowana jest sól + hasło.To wyjaśnienie miało naprawdę dużo sensu.
Być może powinieneś zaktualizować tę odpowiedź, aby wspomnieć o argonie2.
xkcd
2014-02-22 00:10:38 UTC
view on stackexchange narkive permalink

Technicznie rzecz biorąc, nadal możesz używać tęczowej tabeli do atakowania solonych haszów. Ale tylko technicznie. Solony haszysz pokonuje ataki tęczowego stołu, nie przez dodanie magii kryptograficznej, ale po prostu wykładniczo zwiększając rozmiar tęczowego stołu wymaganego do pomyślnego znalezienia kolizji.

I tak, musisz przechowywać sól :)

Głosowano za, ponieważ jest to jedyna odpowiedź, która faktycznie wyjaśnia, dlaczego solone hashe pomagają w walce z tęczowymi stołami.
i robi to * wykładniczo *.
Rozmiar stołu nie byłby większy.Dla każdego z użytkowników potrzebna byłaby osobna tablica tęczowa (ponieważ dla hasła każdego użytkownika jest używana inna sól), ale rozmiar każdego z nich byłby taki sam.Zamiast pobierać tęczową tabelę dla, powiedzmy, skrótów SHA-1 ciągów, możesz utworzyć własne dla, powiedzmy, skróty SHA-1 solonych ciągów `CYyohYn8MGYk`.Byłoby to jednak bezużyteczne ćwiczenie, ponieważ atak brutalnej siły na określone hasło byłby szybszy.Sole działają nie z powodu zwiększenia rozmiaru tabeli, ale dlatego, że powodują, że standardowe tabele tęczowe do pobrania są bezużyteczne.
@mgr326639 - w mojej odpowiedzi nie odnosiłem się do „standardowych tabel tęczowych do pobrania”, w rzeczywistości nie wiem, czy istnieje jakiś standard.Pytanie dotyczyło „budowania” tęczowego stołu.Możesz mieć jedną dużą tabelę, która obsługuje całość lub możesz mieć tyle tabel, ile soli lub dowolnego logicznego lub fizycznego schematu partycjonowania, zgodnie z Twoimi zasobami lub innymi czynnikami.
AJ Henderson
2014-02-21 03:01:17 UTC
view on stackexchange narkive permalink

Nie jest dodawany po krzyżyku. Jest dodawany przed hashem, więc hash jest zupełnie inny dla każdej soli.

To nie jest

  hash abcd = defgstore 123defg (dla użytkownika z 123 salt) i 456defg (dla użytkownika z solą 456) 

Jest to

  hash 123abcd = ghij hash 456abcd = klmn  
Te dwa ostatnie zdania zajęły mi trochę czasu, zanim przeanalizowałem :-)
@YolandaRuiz - próbowałem to trochę wyczyścić
Mój mózg trochę się roztopił, ale teraz widzę, co tam zrobiłeś. ;-)
Może to uczynić sprawę bardziej zrozumiałą, jeśli powiesz „jeden użytkownik ma hasło abcd z saltem 123, a drugi ma hasło abcd z saltem 456. Następnie w drugim przykładzie dodaj wiersz„ store 123ghij and 456klmn ”.
Anti-weakpasswords
2014-02-21 09:39:34 UTC
view on stackexchange narkive permalink

W przypadku skrótów haseł musisz użyć czegoś takiego jak PBKDF2 / RFC2898 / PKCS5v2, Bcrypt lub Scrypt, z których wszystkie pozwalają wybrać liczbę iteracji („współczynnik pracy”), a nie niż tylko jeden. Na przykład PBKDF2 używa haszowania z kluczem HMAC z dobrze znanym algorytmem wyznaczania wartości skrótu (zwykle SHA-512, SHA-256 lub SHA-1) wewnętrznie dla wielu iteracji, najlepiej od dziesiątek do setek tysięcy tak wysoko, jak to tylko możliwe, zasadniczo bez narzekania użytkowników.

Przyczyną dużej liczby iteracji jest spowolnienie atakującego, co z kolei zmniejsza przestrzeń kluczową, przez którą może przejść w danym okresie , więc nie mogą skutecznie atakować lepszych haseł. Oczywiście „hasło” i „P @ $$ w0rd” zostaną złamane niezależnie od ataku offline.

Masz rację, każdy wiersz (użytkownik) potrzebuje własnej unikalnie wygenerowanej, kryptograficznie losowej długiej soli . Ta sól jest przechowywana w postaci tekstu jawnego.

W przypadku PBKDF2, Bcrypt lub Scrypt zalecałbym również przechowywanie liczby iteracji (współczynnika pracy) w bazie danych również w postaci zwykłego tekstu, aby można było łatwo zmienić (osobiście używam nieco losowej liczby iteracji - jeśli zawsze jest inaczej, jest mniej strachu, że „o nie, drobna zmiana może wszystko zepsuć - NIGDY NIE ZMIENIAJ TEGO PONOWNIE” od kierownictwa lub innych programistów)

Pamiętaj, że używając PBKDF2 jako hasła haszowanie, nigdy nie pytaj o większe dane wyjściowe niż natywne dane wyjściowe skrótu - dla SHA-1 to 20 bajtów, a dla SHA-512 to 64 bajty.

Aby podać rzeczywiste przykłady PBKDF2 z dwoma różnymi solami

(wyniki PBKDF2 HMAC Salt hasło iteracji outputbytes)

  • PBKDF2 HMAC-SHA-512 mojehaslo vA8u3v4qzCdb 131072 64
    • 2e3259bece6992f012966cbf5803103fdea7957ac20f3ec305d62994a3f4f088f26cc3889053fb59a4e3c282f55e9179695609ee1147cffae1455880993ef874
  • PBKDF2 HMAC-SHA-512 MyPass l6eZQVf7J65S 131072 64
    • 1018ad648096f7814bc2786972eb4091f6c36761a8262183c24b0f4d34abb48073ed2541ee273220915638b46ec14dfb2b23ad64c4aa12f97158340bdc12fc57
mathrick
2014-02-26 14:42:59 UTC
view on stackexchange narkive permalink

Oprócz tego, co powiedział Tylerl, ważne jest, aby podkreślić, że we współczesnych kryptowalutach sole nie są używane do ochrony przed tęczowymi tablicami. Nikt tak naprawdę nie używa tęczowych tabel. Prawdziwym niebezpieczeństwem jest zrównoleglenie:

  • Jeśli nie masz soli lub tylko statycznej soli, a ja kradnę twój DB miliona hashów, mogę rzucić wszystkie moje rdzeni w bruteforsing it, a każdy rdzeń będzie atakował milion skrótów jednocześnie, ponieważ za każdym razem, gdy uderzę którykolwiek ciąg znaków używanych jako hasło, zobaczę dopasowanie skrótu. Dlatego muszę wyczerpać przestrzeń wyszukiwania raz , aby złamać milion haseł. Jest to całkowicie realistyczna skala wycieku haseł i wystarczająco atrakcyjny cel, aby rzucić kilka tuzinów GPU lub nawet niestandardowego FPGA. Nawet jeśli wyczerpię tylko dolne 30% przestrzeni wyszukiwania, i tak odejdę z 500 000 prawdziwych haseł. Te hasła zostaną następnie użyte do zbudowania mojego słownika, więc następnym razem, gdy ktoś wycieknie z bazy danych z hashami, złamie 90% z nich w ciągu kilku godzin.
  • Jeśli zamiast tego każde hasło zostanie zaszyfrowane ze swoim własnym , unikalna sól, będę musiał zaatakować każdego z nich z osobna, ponieważ nawet identyczne hasła będą miały zupełnie inne skróty. Oznacza to, że być może mógłbym użyć mojej drogiej, energochłonnej farmy GPU / FPGA do zaatakowania kilku wartościowych celów (powiedzmy, że Obama byłby twoim użytkownikiem, to zdobycie jego hasła nadal gwarantowałoby wydatek), ale nie dostanę kilkaset tysięcy haseł za darmo. Gdybym chciał uzyskać całe miliony haseł, musiałbym przeprowadzić pełne wyszukiwanie siłowe milion razy.

I dlatego każda sól, statyczna lub nie, ochroni Cię przed przygotowanymi tęczowymi stołami, o ile nie jest szeroko stosowana, ale tylko unikalne sole haszyszowe ochronią Cię przed prawdziwym niebezpieczeństwem użycia dużej ilości równoległej mocy obliczeniowej do złamania wszystkiego. na raz.

zakiakhmad
2014-02-21 09:15:17 UTC
view on stackexchange narkive permalink

Jest to bezpieczniejsze, ponieważ gdy wiele osób ma to samo hasło, będzie miało inny skrót.

Prosta implementacja za pomocą Pythona:

  import hashlibpasswordA = '123456'passwordB =' 123456'hashlib.md5 (hasłoA) .hexdigest () 'e10adc3949ba59abbe56e057f20f883e'hashlib.md5 (hasłoB) .hexdigest ()' e10adc3949ba59abbe56e057f20f883e ' 

A teraz dodaj sól

pre> saltA = 'qwerty'salbB =' asdfgh'passA = hasłoA + saltApassB = hasłoB + saltBhashlib.md5 (passA) .hexdigest () '086e1b7e1c12ba37cd473670b3a15214'hashlib.md5 (passBest7). / code>

To jest bardzo uproszczona wersja. Możesz dodać sól w dowolnym miejscu. Na początku / środku / końcu hasła.

Sól jest bardzo przydatna, zwłaszcza gdy masz wielu użytkowników, więc każdy z nich będzie miał różne skróty. Teraz wyobraź sobie prawdopodobieństwo posiadania tych samych haseł do milionów kont, takich jak Facebook, Google czy Twitter.

gnasher729
2014-02-22 00:07:45 UTC
view on stackexchange narkive permalink

Po pierwsze, jeśli dwóch użytkowników używa raczej słabego hasła „baseball”, złamanie jednego hasła w ogóle nie pomaga w złamaniu drugiego hasła ze względu na „salting”. Bez solenia złamałeś dwa hasła za cenę jednego.

Po drugie, tęczowe tabele zawierają wstępnie obliczone skróty. Więc cracker mógłby znaleźć haszysz „baseball” w tęczowej tabeli z miliardami wpisów. Znacznie szybsze niż obliczanie haszy gazylionów w tęczowej tabeli. A temu zapobiega solenie.

A teraz jedna ważna rzecz: niektórzy ludzie mają dobre hasła, inni mają złe hasła. Jeśli masz milion użytkowników i trzech używa tego samego hasła, po prostu wiesz , że hasło jest słabe. Bez solenia masz trzy identyczne skróty. Więc jeśli ktoś ukradnie twoją bazę danych skrótów, może natychmiast zobaczyć, którzy użytkownicy mają słabe hasła i skoncentrować się na ich złamaniu. O wiele łatwiej złamać „baseball” niż 1keOj29fa0romn. Bez solenia słabe hasła wyróżniają się. Dzięki soleniu cracker nie ma pojęcia, które hasła są słabe, a które trudne do złamania.

Kaz
2014-06-27 01:14:46 UTC
view on stackexchange narkive permalink

To, czy hash jest solone, czy nie, ma znaczenie tylko wtedy, gdy atakujący ma skrót hasła. Bez soli hash można zaatakować za pomocą tęczowej tabeli: wstępnie obliczonego słownika, który kojarzy hasła z hashami. Sól N-bitowa zwiększa zapotrzebowanie na pamięć dla tablicy tęczowej i czas potrzebny do obliczenia tej tabeli o współczynnik 2 ** N. Na przykład, w przypadku 32-bitowej soli, tylko jeden wpis w słowniku tęczowej tablicy, powiedzmy dla hasła passw0rd , wymaga wielu gigabajtów pamięci, co czyni tę tęczową tablicę bardzo kosztowną przy użyciu obecnego sprzętu do przechowywania danych. Więc gdy występuje sól, atakujący zostaje zredukowany do ataku siłowego na określony zestaw skrótów haseł, które zostały uzyskane.

Jednak:

  • dla słabych haseł , atak siłowy zakończy się sukcesem w stosunkowo krótkim czasie.
  • wystarczająco silne hasła nie zostaną znalezione w tęczowej tabeli.
  • jeśli atakujący ma dostęp do skrótów, bezpieczeństwo systemu zostały już naruszone: nowoczesne systemy i protokoły nie ujawniają swoich skrótów haseł. Jeśli atakujący nie może uzyskać dostępu do bazy danych haseł, hasła mogą być równie dobrze przechowywane w postaci zwykłego tekstu.
  • jeśli atakujący musi złamać zabezpieczenia systemu, aby uzyskać dostęp do skrótów w celu odwrócenia haseł z nich, jedynymi hasłami, które mają wartość dla atakującego, są te, które są ponownie wykorzystywane w innych domenach bezpieczeństwa, do których atakujący nie ma jeszcze dostępu. Hasła, które nie są ponownie wykorzystywane, nie mają żadnej wartości (a na pewno mniej wartości niż inne poufne informacje powiązane z kontami).

Powiedzmy, że użytkownik joewestlake używa hasła god1234 . Atakujący odwraca to natychmiast, używając tęczowej tabeli. (Lub w ciągu zaledwie kilku minut od złamania za pomocą ataku siłowego, jeśli hash jest zasolony, ponieważ hasło jest tak złe). Problem polega na tym, że joewestlake używał również god1234 dla swojego konta Gmail i dla bankowości internetowej, ups! Teraz atakujący czyta e-maile Joego i dowiaduje się o nim wystarczająco dużo, aby mógł łatwo odpowiedzieć na pytanie „jakie było imię Twojego pierwszego zwierzaka”, logując się do bankowości internetowej Joe.

uzasadnieniem dla soli jest to, że w pewnym stopniu chronią one użytkowników, utrudniając odwracanie haseł o średnim poziomie bezpieczeństwa: hasła, które bez soli mogłyby znaleźć się w tęczowej tablicy, ale które są wystarczająco silne że indywidualne brutalne zmuszanie ich zajmuje bardzo dużo czasu. Ale sole zapewniają tę korzyść tylko w przypadku, gdy hashe zostaną naruszone, co już stanowi poważne naruszenie bezpieczeństwa, a korzyść dotyczy tylko tych użytkowników, którzy ponownie używają swoich haseł o średnim poziomie bezpieczeństwa w innych systemach.

Powiedz Joe zamiast tego użył hasła składającego się z 10 losowych znaków alfanumerycznych i symboli. Może to nadal znajdować się w tęczowym stole, ale wymaga dużo pracy. Więc nawet jeśli Joe użył tego samego hasła do Gmaila i bankowości internetowej, dzięki soli jest bezpieczny. Cracker uruchamia swoją brutalną siłę przez może kilka godzin, może dni. Łamanie daje wiele słabych haseł od innych użytkowników tego samego systemu, którzy mają słabe hasła. Atakujący jest zadowolony z tego ustępstwa i przestaje pękać; Hasło Joe nigdy nie jest odwracane.

Ponadto, jeśli włamanie zostanie wykryte, a użytkownikom (w tym Joe) doradzi się zmianę haseł, wówczas Joe ma szansę wyprzedzić próby włamania atakującego, nawet jeśli atakujący będzie nadal atakował całą przestrzeń haseł o średnim poziomie bezpieczeństwa, która zawiera hasło Joe. Joe wie, że hasło, którego użył w zaatakowanym systemie, jest dokładnie takie samo jak hasło do Gmaila i do konta bankowego, więc próbuje zmienić te dwa pozostałe. Sól pomaga tutaj, ponieważ kupuje czas użytkownikom ponownie wykorzystującym hasła na zmianę hasła. Sól nie pomoże osobom z bardzo słabymi hasłami, które są łamane w ciągu kilku minut, ale użytkownicy haseł, których złamanie trwa godzinami lub dniami, mają szansę na walkę.



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...