Kiedy strona informuje cię, że złamanie twojego hasła zajęłoby trzy miliony lat, pomija najważniejszą część zdania. Właściwe pytanie nie brzmi „jak długo”. Brzmi: jak długo i przeciwko czemu.
A odpowiedzi na to przeciwko czemu nie udzielasz ty. Udzielił jej programista sklepu, w którym w 2019 roku kupiłeś buty, w chwili gdy zdecydował, jak zapisać twoje hasło w bazie danych. Ty wpisałeś w obu serwisach dokładnie ten sam dwudziestoznakowy ciąg. W jednym wytrzyma stulecia, w drugim padnie przed obiadem.
Liczba, której brakuje w równaniu
Atak siłowy to arytmetyka na poziomie podstawówki: liczba kandydatów do sprawdzenia podzielona przez liczbę kandydatów, których da się sprawdzić w ciągu sekundy. Pierwszy czynnik zależy od twojego hasła — jego długości, alfabetu, tego, czy stoi w słowniku, czy nie. Drugi nie ma z tobą absolutnie nic wspólnego.
Drugi czynnik zależy od dwóch rzeczy: od sprzętu atakującego oraz, przede wszystkim, od funkcji, którą serwis zamienił twoje hasło w ten ciąg krzaków przechowywany w tabeli użytkowników. Ta funkcja nazywa się hash, czyli skrót — i nie każdy skrót kosztuje tyle samo obliczeń.
MD5 i SHA-1 zaprojektowano tak, żeby były szybkie. To zaleta: to funkcje skrótu ogólnego przeznaczenia, stworzone do streszczania wiadomości i sprawdzania integralności, a tam chcesz przemielić gigabajt, zanim zdążysz wstać po kawę. Kiedy ktoś używa ich do przechowywania haseł, ta zaleta staje się problemem. Funkcja, którą możesz policzyć miliony razy na sekundę, to funkcja, którą atakujący też policzy miliony razy na sekundę — a on ma karty graficzne i cały weekend.
bcrypt i Argon2 zaprojektowano z myślą odwrotną. Są wolne celowo, i — to jest w tym najelegantsze — z regulowaną powolnością. Niels Provos i David Mazières przedstawili bcrypt w 1999 roku pod tytułem, który mówi wszystko: A Future-Adaptable Password Scheme. Chodziło o to, żeby funkcję dało się z biegiem lat podrażać w takim tempie, w jakim tanieje sprzęt. Argon2, zwycięzca Password Hashing Competition w 2015 roku, dołożył jeszcze jedno: kosztuje nie tylko czas, kosztuje też pamięć — a akurat z pamięcią karty graficzne mają najwięcej kłopotu.
Między szybkim skrótem a dobrze skonfigurowanym wolnym skrótem nie ma różnicy wyrażanej w procentach. Są rzędy wielkości. Wiele rzędów.
Benchmarki istnieją i są publiczne
Nic z tego nie jest spekulacją. Hashcat, narzędzie, którym pół świata łamie hasła — ci dobrzy też — ma tryb benchmarku, który każdy może uruchomić na własnej maszynie i który mierzy, algorytm po algorytmie, ile razy na sekundę da się policzyć każdy z nich. Społeczność publikuje takie tabele przy każdej nowej generacji GPU.
Najciekawsza w tych tabelach nie jest żadna konkretna liczba — te i tak tracą ważność z każdą generacją sprzętu — tylko odległość między wierszami. Sortujesz listę po prędkości i widzisz MD5 na samej górze, na własnej planecie. Schodzisz coraz niżej, a na dnie tabeli siedzą bcrypt i Argon2 z wynikami, które nie przypominają tamtych w niczym. To jest to samo hasło. To jest ta sama karta graficzna. Zmieniło się wyłącznie to, jak serwis postanowił je zapisać.
Dlatego „3 miliony lat” bez podania, przeciwko jakiemu skrótowi, to marketing, a nie pomiar. To jak reklamować samochód hasłem, że dojeżdża w sześć godzin, i nie wspomnieć dokąd.
Offline i online: dwa światy, które się nie stykają
Jest jeszcze drugie rozróżnienie, którego prawie nikt nie tłumaczy, a które zmienia wynik równie brutalnie.
W ataku online atakujący sprawdza hasła przez formularz logowania, tak jak zrobiłby to użytkownik. Tempa nie narzuca jego sprzęt: narzuca je serwer. Może być limit prób, czasowa blokada, captcha, opóźnienie między żądaniami, alert po tysiącu nieudanych prób z tego samego adresu. Przeciwko przyzwoicie bronionemu serwisowi atak online jest wolny, głośny i dość głupi. Arytmetyka wypada dla atakującego tak fatalnie, że czystej siły prawie się nie próbuje: sprawdza się cztery wieczne hasła przeciwko milionom kont, a to już zupełnie inna gra.
W ataku offline atakujący ma już zrzut bazy danych. Zabiera go do domu. Tam nie ma serwera, nie ma limitu prób, nie ma nikogo, kto by patrzył: są jego karty graficzne i jego rachunek za prąd. Może próbować miesiącami i nikt się nie dowie, a to, że trafił, ustali sam, porównując skróty. To tutaj skrót decyduje o wszystkim, bo skrót jest dosłownie jedyną rzeczą, która go hamuje.
I wypada być uczciwym co do prawdopodobieństw: scenariusz offline nie jest egzotyczny. Dzieje się dokładnie to za każdym razem, gdy wycieka baza danych. Kiedy LinkedIn stracił swoją w 2012 roku, analiza opublikowanego zrzutu pokazała, że hasła przechowywano tam w SHA-1 bez soli: szybki skrót, w dodatku bez składnika, który uniemożliwia wcześniejsze przygotowanie tablic. To, że tak wiele haseł padło tak szybko, nie było wyłącznie kwestią złych wyborów użytkowników. Było przede wszystkim decyzją inżynieryjną, której żaden użytkownik nigdy nie zobaczył.
Co robimy u siebie i dlaczego o tym mówimy
Nasze narzędzie do sprawdzania haseł zakłada 10¹² prób na sekundę, offline, przeciwko szybkiemu skrótowi. Jest to napisane wprost na stronie, pod wynikiem, i nie z przezroczystości na pokaz: bez tej informacji pokazywany ci czas nie znaczy nic.
To celowo zły przypadek. Zakładamy, że baza już wyciekła, że atakujący ma poważny sprzęt, że serwis zapisał twoje hasło w możliwie najgorszy rozsądny sposób, a do tego zna twój alfabet i twoją długość. Jeśli serwis użył dobrze skonfigurowanego bcrypta, prawdziwa liczba rośnie o wiele rzędów wielkości, a twoje hasło wytrzyma znacznie dłużej, niż ci mówimy.
Wolimy mylić się w tę stronę. Narzędzie, które ci gratuluje, gratuluje samo sobie.
Niewygodny wniosek
Twoje hasło nie ma jednego czasu złamania. Ma czas złamania dla każdego serwisu, w którym go użyłeś, a ten czas ustalają ludzie, których nie znasz, według kryteriów, których nie publikują.
Wynikają z tego dwie rzeczy, te same co zawsze. Pierwsza: skoro nie kontrolujesz skrótu, kontroluj entropię — połowę równania, która naprawdę należy do ciebie. Właśnie dlatego generator pokazuje ci bity, a nie sympatyczny procent. Druga, ważniejsza: jeśli każdy serwis ma własne hasło, ten, który zapisał je w MD5, może oddać w prezencie wyłącznie hasło do siebie.
Bo słabym ogniwem nie jest twoje hasło. Jest nim najgorszy serwis, w którym je wpisałeś.
Źródła: publiczne benchmarki hashcata (hashcat -b), możliwe do sprawdzenia i odtworzenia · N. Provos i D. Mazières, „A Future-Adaptable Password Scheme”, USENIX, 1999 · Password Hashing Competition, wygrana przez Argon2 w 2015 roku · model zagrożenia zadeklarowany w narzędziu do sprawdzania haseł password.es: 10¹² prób/s, offline, szybki skrót · wyciek z LinkedIna z 2012 roku: firma potwierdziła naruszenie, a użycie SHA-1 bez soli ustalono na podstawie analizy opublikowanego zrzutu.