Algorytm skracania haseł funkcją crypt()

2008-10-25 00:00:00 +0100


Funkcja crypt() jest funkcją skrótu stosowaną do przechowywania haseł w systemach uniksowych od ich zarania. Ze względu na bardzo charakterystyczny sposób uwierzytelniania użytkowników przez te systemy, warto poznać samą funkcję jak i sposób jej wykorzystania.

Podstawowym problemem uwierzytelniania użytkowników dużego systemu serwerowego jest to, że musi on przechowywać w jednym miejscu dane wielu użytkowników wraz z ich hasłami, co może mieć tragiczne konsekwencje w razie naruszenia bezpieczeństwa takiej bazy danych.

Problem ten rozwiązano podczas rozwoju systemu Unix już w 1976 roku. System nie przechowywał samych haseł, a jedynie ich skróty - to jest wartości uzyskane z hasła w taki sposób, że znając skrót nie można odtworzyć hasła.

Uwierzytelnienie użytkownika jest równie proste co pomysłowe: użytkownik podaje hasło, system oblicza jego skrót i porównuje z tym, który ma w bazie. Jeśli są takie same, to znaczy że użytkownik podał poprawne hasło. W ten sposób można uwierzytelniać użytkowników bez konieczności przechowywania "odkrytych" haseł w systemie.

Sama funkcja crypt() wykorzystywana jako skrót dla haseł ewoluowała na przestrzeni lat. Jej podstawowa odmiana wykorzystuje algorytm DES. Obliczanie skrótu dla nowego hasła odbywa się następująco:

  1. losujemy 12-bitowy salt, który gwarantuje, że to samo hasło może być zaszyfrowane na 4096 sposobów, co znacznie spowalnia ataki słownikowe
  2. wykorzystując hasło jako klucz DES szyfrujemy nim 25 razy blok 8-miu zer
  3. rezultatem jest połączenie 12-bitowego salta z 64-bitowym wynikiem szyfrowania DES, zakodowane następnie w 13 znakach ASCII

Procedura jest identyczna podczas weryfikacji hasła z tą różnicą, że w pierwszym kroku nie losujemy salta, tylko bierzemy go z bazy haseł znanych użytkowników.

Modyfikacja algorytmu DES za pomocą salt polega na przestawieniu określonych bitów w wyjściowym E-boksie szyfru w zależności od wartości salt. Po pierwsze, wprowadza to pożądaną różnicę w wynikowych kryptogramach, po drugie powoduje że istniejące sprzętowe implementacje DES są bezużyteczne do celów łamania haseł.

Opisana metoda ta ma dwie wady: po pierwsze efektywna długość hasła wynosi tylko 8 znaków, po drugie zastosowanie DES powoduje że ilość możliwych kombinacji (2^56) jest zbyt mała jak na dzisiejsze wymagania. To co wydawało się niemożliwe w latach 70-tych, dziś jest proste do zrealizowania przy pomocy maszyn obecnych powszechnie w domach i na uczelniach.

Kolejna mutacja MD5 crypt wykorzystywała funkcję skrótu MD5, również zmodyfikowaną saltem (12 do 48 bitów). Rezultat miał 128 bitów (plus długość saltu) i nie nakładał żadnego ograniczenia na długość hasła. Wersja ta jest obecnie wykorzystywana powszechnie w nowoczesnych systemach uniksowych, ale także np. w routerach Cisco.

Jeszcze doskonalszą funkcją służącą do jednokierunkowego szyfrowania haseł jest funkcja bcrypt wykorzystująca szyfr Blowfish i nie posiadająca szeregu wad, które posiada MD5 crypt. Jest ona stosowana w systemie OpenBSD.

Bibliografia