tęczowe tablice
| Po angielsku | rainbow table |
|---|---|
| Którą formą pisać | po polsku Polska nazwa przyjęła się w tekstach i w wyszukiwarce — używaj jej samodzielnie. |
| Inne formy | tablice tęczowe · tęczowa tablica · rainbow tables |
| Kategoria | Kryptografia, tożsamość i uwierzytelnianie |
Tęczowe tablice to wcześniej przygotowane tablice łańcuchów skrótów, które pozwalają szybko odzyskać hasło z jego niesolonego hasha. Metodę opisał Philippe Oechslin w 2003 roku jako ulepszenie kryptoanalitycznego kompromisu czas–pamięć, przedstawionego przez Martina Hellmana w 1980 roku [1]. Tablice działają tylko wtedy, gdy ten sam tekst jawny zawsze daje ten sam hash. MITRE wskazuje, że brak soli ułatwia atakującym wcześniejsze obliczenie hashy technikami słownikowymi, takimi jak tęczowe tablice [2].
Jak działa
Najprostszy atak przez wcześniejsze obliczenia polega na zapisaniu hasha każdego możliwego hasła. Oechslin zauważa, że taki atak po wykonaniu obliczeń działa niemal natychmiast, ale wymaga zbyt dużej ilości pamięci [1]. Metoda Hellmana zmniejsza zapotrzebowanie na pamięć kosztem czasu: z wartości skrótu tworzy się kolejne kandydaty na hasło za pomocą funkcji redukcji, a z tak powstałego łańcucha zapisuje tylko pierwszy i ostatni element [1].
Wadą klasycznych łańcuchów jest to, że zderzenie dwóch łańcuchów w jednej tabeli powoduje ich scalenie. Oechslin zaproponował łańcuchy nazwane tęczowymi, które w każdym kolejnym kroku używają innej funkcji redukcji [1]. Dwa łańcuchy scalają się wtedy tylko przy zderzeniu na tej samej pozycji [1].
Przy ataku atakujący bierze hash z wykradzionej bazy, odtwarza końcówki możliwych łańcuchów i szuka ich w tablicy. Po trafieniu odtwarza łańcuch od zapisanego początku aż do hasła, które daje szukany hash. Metoda jest probabilistyczna: powodzenie nie jest pewne, a skuteczność zależy od czasu i pamięci przeznaczonej na atak [1].
Porównanie z innymi atakami na hashe
Tęczowe tablice to jedna z kilku metod łamania haseł. Różnią się tym, kiedy wykonywana jest praca obliczeniowa.
| Metoda | Kiedy liczy | Co ją zatrzymuje |
|---|---|---|
| atak siłowy (brute force) | po wycieku, dla każdego hasha | wolna funkcja haszująca [2] |
| atak słownikowy | po wycieku, dla listy kandydatów | wolna funkcja, silne hasła |
| tęczowe tablice | raz, przed atakiem [1] | unikalna sól [2] |
W WordPressie
Tęczowe tablice są wobec hashy haseł tworzonych przez współczesny rdzeń WordPressa bezużyteczne, bo są one solone. Wcześniej hasła zapisywano metodą phpass, a od wersji 6.8 WordPress używa bcrypt [6]. Nowe hashe są liczone funkcją PHP password_hash(), która dla każdego hasła generuje losową sól [7]. Dokumentacja PHP zaznacza, że tak właśnie funkcja ma działać, a od PHP 8.0 sól podana ręcznie jest ignorowana [7].
Stare hashe nie wymagają interwencji: WordPress przelicza hasło na bcrypt przy pierwszym logowaniu po aktualizacji albo przy zmianie hasła [6]. Zapowiedź zmiany wymienia jednak także starsze, zwykłe hashe MD5 w postaci 32 znaków szesnastkowych, które nadal mogą się pojawić w bazie [6]. Taki skrót nie zawiera soli, więc warto sprawdzić, czy w tabeli użytkowników nie zostały konta z hasłem w tej postaci. Ryzyko pojawia się poza rdzeniem, gdy wtyczka zapisuje hasła lub tokeny własnym kodem, na przykład prostym md5() bez soli. Taki kod należy traktować jako podatność we wtyczce. Warto też pamiętać, że klucze bezpieczeństwa i sole z pliku wp-config.php dotyczą ciasteczek, a nie hashy haseł.
Znaczenie
Tęczowe tablice ilustrują, dlaczego sam wybór funkcji skrótu (hash function) nie wystarcza do przechowywania haseł. W wyniku wycieku danych atakujący dostaje kopię bazy i może pracować bez ograniczeń czasu i bez limitu prób logowania. Gdy hashe nie mają soli, jedna tablica łamie hasła wszystkich użytkowników, a jednakowe hasła mają jednakowe hashe. Odzyskane hasła trafiają potem na combolisty i są używane w atakach credential stuffing na inne serwisy.
Jak się bronić
Podstawą jest sól. OWASP definiuje ją jako unikalny, losowo generowany ciąg dodawany do każdego hasła przy haszowaniu i podaje, że sól zapobiega atakom tęczowymi tablicami [3]. Dzięki soli identyczne hasła różnych użytkowników dają różne hashe [3]. NIST wymaga, by sól miała co najmniej 32 bity [4]. Te same wytyczne zalecają, by współczynnik kosztu funkcji haszującej był tak wysoki, jak pozwala wydajność serwera, i był z czasem podnoszony wraz ze wzrostem mocy obliczeniowej [4]. MITRE ostrzega jednak, że sól nie zmniejsza nakładu pracy przy ataku na pojedynczy hash, a współczesne ataki liczą ogromne liczby skrótów na GPU, układach ASIC albo FPGA [2]. Dlatego sól łączy się z funkcją adaptacyjną, której koszt można regulować, taką jak bcrypt, scrypt albo PBKDF2 [2]; mechanizm opisuje hasło KDF. Dodatkową warstwą może być pieprz.
Historia i przykłady
Oechslin zademonstrował metodę na hashach LanManager z systemu Windows. Przy 1,4 GB danych, czyli dwóch płytach CD-ROM, jego implementacja łamała 99,9% hashy haseł alfanumerycznych w 13,6 sekundy, podczas gdy metoda z punktami wyróżnionymi potrzebowała 101 sekund [1]. Hash LanManager był łatwym celem: hasło dzielono na dwie części po siedem znaków, zamieniano małe litery na wielkie i każdą część szyfrowano algorytmem DES ze stałym tekstem jawnym [1]. Microsoft opisuje hash LM jako stosunkowo słaby w porównaniu z hashem NT i podatny na szybki atak siłowy; zaleca wyłączenie jego przechowywania [5]. Według tej samej dokumentacji Windows tworzy oba hashe, LM i NT, gdy hasło ma mniej niż 15 znaków [5]. Najprostszym sposobem uniknięcia użytecznego hasha LM jest hasło o długości co najmniej 15 znaków; zapisana wtedy wartość LM nie pozwala uwierzytelnić użytkownika [5].
Przypisy
7- [1] Making a Faster Cryptanalytic Time-Memory Trade-Off (CRYPTO 2003) · IACR / Philippe Oechslin, EPFL
- [2] CWE-759: Use of a One-Way Hash without a Salt · MITRE
- [3] Password Storage Cheat Sheet · OWASP
- [4] NIST SP 800-63B-4: Digital Identity Guidelines — Authentication and Authenticator Management · NIST
- [5] Prevent Windows from storing a LAN Manager (LM) hash of the password in AD and local SAM databases · Microsoft Learn
- [6] WordPress 6.8 will use bcrypt for password hashing · Make WordPress Core
- [7] password_hash — PHP Manual · The PHP Group