Ewolucja funkcji skrótu dla haseł
Mogłeś usłyszeć porady dotyczące wyboru algorytmów skrótu dla haseł, ale zastanawiałeś się, dlaczego są one zalecane? W tym artykule przyjrzymy się ewolucji algorytmów skrótu dla haseł i powodom ich zalecania.
Wprowadzenie
Skórtowanie haseł, jak sama nazwa wskazuje, polega na obliczaniu wartości skrótu z hasła. Wartość ta zazwyczaj przechowywana jest w bazie danych, a podczas procesu logowania (sign-in) obliczana jest wartość skrótu hasła wprowadzonego przez użytkownika i porównuje się ją z wartością skrótu przechowywaną w bazie danych. Jeśli są one zgodne, użytkownik jest uwierzytelniony.
Zanim zajmiemy się ewolucją algorytmów skrótu dla haseł, ważne jest zrozumienie, dlaczego są one potrzebne.
Hasła w formacie nieskompresowanym: poważne ryzyko bezpieczeństwa
Wyobraź sobie, że jesteś użytkownikiem strony internetowej, na której zarejestrowałeś konto. Pewnego dnia strona ta zostaje zhackowana, a baza danych zostaje przeciekła. Jeśli strona przechowuje hasła w formacie nieskompresowanym, haker może bezpośrednio uzyskać dostęp do twojego hasła. Ponieważ wiele osób używa tych samych haseł na wielu stronach, haker może użyć tego hasła do uzyskania nieautoryzowanego dostępu do twoich innych kont. Sytuacja staje się jeszcze gorsza, jeśli używasz tego samego lub podobnego hasła do swojego konta e-mail, ponieważ haker może zresetować twoje hasło i przejąć kontrolę nad wszystkimi powiązanymi kontami.
Nawet bez naruszenia danych, w dużych zespołach każdy, kto ma dostęp do bazy danych, może zobaczyć hasła. W porównaniu z innymi informacjami, hasła są bardzo wrażliwe i na pewno nie chcesz, aby ktokolwiek miał do nich dostęp.
Przechowywanie haseł bez skrótu to błąd amatora. Niestety, jeśli wyszukasz "password leak plaintext", znajdziesz informacje o tym, że duże korporacje takie jak Facebook, DailyQuiz i GoDaddy doświadczyły przecieku haseł w formacie nieskompresowanym. Prawdopodobnie wiele innych firm popełniło ten sam błąd.
Kodowanie vs. szyfrowanie vs. skróty
Te trzy terminy często są mylone, ale są to różne pojęcia.
Kodowanie
Kodowanie jest pierwszym elementem, który należy wykluczyć w przechowywaniu haseł. Na przykład, Base64 jest algorytmem kodowania, który konwertuje dane binarne na ciąg znaków:
Znając algorytm kodowania, każdy może zdekodować zakodowany ciąg i odzyskać oryginalne dane:
Dla hakerów, większość algorytmów kodowania jest równoważna z tekstami nieskompresowanymi.
Szyfrowanie
Przed zyskaniem popularności funkcji skrótu, do przechowywania haseł używano szyfrowania, na przykład z AES. Szyfrowanie polega na użyciu klucza (lub pary kluczy) do szyfrowania i deszyfrowania danych.
Problem z szyfrowaniem jest oczywisty w terminie "deszyfrowanie". Szyfrowanie jest odwracalne, co oznacza, że jeśli haker uzyska klucz, może zdeszyfrować hasło i odzyskać hasło w postaci nieskompresowanej.
Skroty
Główna różnica między skrótem, kodowaniem i szyfrowaniem polega na tym, że skróty są nieodwracalne. Po zhashowaniu hasła nie można go zdeszyfrować do pierwotnej formy.
Jako właściciel strony internetowej, nie musisz tak naprawdę znać samego hasła, wystarczy, że użytkownik może zalogować się za pomocą poprawnego hasła. Proces rejestracji może być uproszczony do następujących kroków:
- Użytkownik wprowadza hasło.
- Usługa używa algorytmu skrótu do obliczenia wartości skrótu hasła.
- Usługa przechowuje wartość skrótu w bazie danych.
Podczas logowania użytkownika proces jest następujący:
- Użytkownik wprowadza hasło.
- Usługa używa tego samego algorytmu skrótu do obliczenia wartości skrótu hasła.
- Usługa porównuje wartość skrótu z wartością skrótu przechowywaną w bazie danych.
- Jeśli wartości skrótu są zgodne, użytkownik jest uwierzytelniony.
Oba procesy unikają przechowywania haseł w formacie nieskompresowanym, a ponieważ skróty są nieodwracalne, nawet jeśli baza danych zostanie skompromitowana, haker może tylko uzyskać wartości skrótu, które wyglądają jak losowe ciągi.
Algorytmy skrótu dla początkujących
Skórtowanie może wydawać się idealnym rozwiązaniem dla przechowywania haseł, ale nie jest to takie proste. Aby zrozumieć dlaczego, przyjrzyjmy się ewolucji algorytmów skrótu dla haseł.
MD5
W 1992 roku Ron Rivest zaprojektował algorytm MD5, algorytm wiadomości skrótu, który może obliczyć 128-bitową wartość skrótu z dowolnych danych. MD5 jest szeroko używany w różnych dziedzinach, w tym w skrótu dla haseł. Na przykład wartość skrótu MD5 dla "123456" wynosi:
Jak już wcześniej wspomniano, wartość skrótu wygląda jak losowy ciąg i jest nieodwracalna. Ponadto, MD5 jest szybki i łatwy w implementacji, co czyni go najpopularniejszym algorytmem skrótu dla haseł.
Jednak zalety MD5 są też jego słabościami w skrótu dla haseł. Jego szybkość sprawia, że jest on podatny na ataki siłą brutto. Jeśli haker posiada listę popularnych haseł i twoje dane osobowe, może obliczyć wartość skrótu MD5 dla każdej kombinacji i porównać je z wartościami skrótu w bazie danych. Na przykład, może połączyć twoje urodziny z twoim imieniem lub imieniem twojego zwierzęcia.
Obecnie komputery są znacznie potężniejsze niż kiedyś, co ułatwia złamanie skrótów haseł MD5 siłą brutto.
Rodzina SHA
Więc dlaczego nie użyć innego algorytmu, który generuje dłuższe wartości skrótu? Rodzina SHA wydaje się być dobrym wyborem. SHA-1 jest algorytmem skrótu, który generuje 160-bitowe wartości skrótu, a SHA-2 to rodzina algorytmów skrótu, które generują wartości skrótu o długości 224-bit, 256-bit, 384-bit i 512-bit. Zobaczmy wartość skrótu SHA-256 dla "123456":
Wartość skrótu SHA-256 jest znacznie dłuższa niż MD5, a także jest nieodwracalna. Jednak jest inny problem: jeśli już znasz wartość skrótu, jak ta powyżej, i widzisz dokładnie taką samą wartość skrótu w bazie danych, wiesz, że hasło to "123456". Haker może stworzyć listę popularnych haseł i ich odpowiednich wartości skrótu, a następnie porównać je z wartościami skrótu w bazie danych. Ta lista jest znana jako tabela tęczowa.
Sól
Aby zniwelować ataki za pomocą tabel tęczowych, wprowadzono pojęcie soli. Sól to losowy ciąg, który dodaje się do hasła przed skrótem. Na przykład, jeśli sól to "sól", a chcesz użyć SHA-256 do skrótu hasła "123456" z solą, zamiast po prostu zrobić:
Robisz:
Jak widać, wynik jest zupełnie inny niż w przypadku skrótu bez soli. Zazwyczaj każdemu użytkownikowi przypisywany jest losowa sól podczas rejestracji, która jest przechowywana w bazie danych obok wartości skrótu. Podczas procesu logowania sól jest używana do obliczenia wartości skrótu wprowadzonego hasła, która następnie jest porównywana z przechowywaną wartością skrótu.
Iteracje
Pomimo dodania soli, wartość skrótu jest nadal podatna na ataki siłą brutto w miarę jak sprzęt staje się coraz mocniejszy. Aby utrudnić to zadanie, można wprowadzić iteracje (tj. wielokrotne wykonanie algorytmu skrótu). Na przykład, zamiast używać:
Mogłoby być:
Zwiększenie liczby iteracji utrudnia złamanie siłą brutto. Jednak wpływa to również na proces logowania, ponieważ staje się on wolniejszy. Dlatego trzeba znaleźć równowagę pomiędzy bezpieczeństwem a wydajnością.
Przerwa w połowie czasu
Zróbmy przerwę i podsumujmy cechy dobrego algorytmu skrótu dla haseł:
- Nieodwracalne (oporność na odwrócenie)
- Trudne do złamania siłą brutto
- Odporność na ataki tabelami tęczowymi
Jak mogłeś zauważyć, sól i iteracje są niezbędne, aby spełnić wszystkie te wymagania. Problem polega na tym, że zarówno MD5, jak i rodzina SHA nie były specjalnie zaprojektowane do skrótu haseł; są szeroko używane do sprawdzania integralności (lub "wiadomości skrótu"). W rezultacie, każda strona internetowa może mieć swoją własną implementację soli i iteracji, co utrudnia standaryzację i migrację.
Algorytmy skrótu haseł
Aby rozwiązać ten problem, kilka algorytmów skrótu zostało specjalnie zaprojektowanych do skrótu haseł. Przyjrzyjmy się niektórym z nich.
bcrypt
bcrypt to algorytm skrótu dla haseł zaprojektowany przez Nielsa Provos i Davida Mazières. Jest on szeroko stosowany w wielu językach programowania. Oto przykład wartości skrótu bcrypt:
Chociaż wygląda to jako kolejny losowy ciąg, zawiera dodatkowe informacje. Rozbijmy to na części:
- Pierwsza sekcja
$2y
wskazuje algorytm, którym jest2y
. - Druga sekcja
$12
wskazuje liczbę iteracji, która wynosi12
. Oznacza to, że algorytm skrótu zostanie wykonany 212=4096 razy (iteracje). - Trzecia sekcja
wNt7lt/xf8wRJgPU7kK2ju
to sól. - Ostatnia sekcja
GrirhHK4gdb0NiCRdsSoAxqQoNbiluu
to wartość skrótu.
bcrypt ma pewne ograniczenia:
- Maksymalna długość hasła wynosi 72 bajty.
- Sól jest ograniczona do 16 bajtów.
- Wartość skrótu jest ograniczona do 184 bitów.
Argon2
Biorąc pod uwagę debaty i ograniczenia istniejących algorytmów skrótu dla haseł, w 2015 roku odbył się konkurs na algorytm skrótu dla haseł. Pomijając szczegóły, skupmy się na zwycięscy: Argon2.
Argon2 to algorytm skrótu dla haseł zaprojektowany przez Alexa Biryukova, Daniela Dinu i Dmitry'ego Khovratovicha. Wprowadza on kilka nowych pojęć:
- Ciężkie dla pamięci: algorytm jest zaprojektowany tak, aby był trudny do zrównoleglenia, co utrudnia łamanie siłą brutto za pomocą GPU.
- Ciężkie dla czasu: algorytm jest zaprojektowany tak, aby był trudny do optymalizacji, co utrudnia łamanie siłą brutto za pomocą układów ASIC (układy scalone dedykowane).
- Odporny na ataki boczne: algorytm jest zaprojektowany tak, aby być odporny na ataki boczne, takie jak ataki czasowe.
Istnieją dwie główne wersje Argon2, Argon2i i Argon2d. Argon2i jest najbezpieczniejszy przed atakami bocznymi, natomiast Argon2d zapewnia największą odporność na ataki złamania GPU.
-- Argon2
Oto przykład wartości skrótu Argon2:
Rozbijmy to na części:
- Pierwsza sekcja
$argon2i
wskazuje algorytm, którym jestargon2i
. - Druga sekcja
$v=19
wskazuje wersję, która wynosi19
. - Trzecia sekcja
$m=16,t=2,p=1
wskazuje koszty pamięciowe, koszty czasowe i stopień równoległości, które wynoszą odpowiednio16
,2
i1
. - Czwarta sekcja
$YTZ5ZnpXRWN5SlpjMHBDRQ
to sól. - Ostatnia sekcja
$12oUmJ6xV5bIadzZHkuLTg
to wartość skrótu.
W Argon2, maksymalna długość hasła wynosi 232-1 bajtów, sól jest ograniczona do 232-1 bajtów, a wartość skrótu jest ograniczona do 232-1 bajtów. Powinno to wystarczyć na większość scenariuszy.
Argon2 jest teraz dostępny w wielu językach programowania, takich jak node-argon2 dla Node.js i argon2-cffi dla Pythona.
Podsumowanie
Na przestrzeni lat algorytmy skrótu dla haseł przeszły znaczącą ewolucję. Jesteśmy winni wdzięczność społeczności zajmującej się bezpieczeństwem za ich dziesięcioletnią pracę nad tym, aby internet był bezpieczniejszym miejscem. Dzięki ich wkładowi, deweloperzy mogą skupić się na budowaniu lepszych usług, nie martwiąc się o bezpieczeństwo skrótu dla haseł. Choć osiągnięcie 100% bezpieczeństwa w systemie może być nieosiągalne, możemy zastosować różne strategie, aby zminimalizować związane z nim ryzyko.
Jeśli chcesz uniknąć problemów związanych z implementacją uwierzytelniania i autoryzacji, możesz wypróbować Logto za darmo. Oferujemy bezpieczne (używamy Argon2!), niezawodne i skalowalne rozwiązania, co pozwala ci skupić się na budowaniu swojego produktu.