Hasło (kryptografia)

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

Hasło – ciąg znaków stosowany powszechnie jako tajny parametr w kryptografii oraz uwierzytelnianiu.

Historycznie hasła w postaci tajnych słów lub zdań były najczęściej stosowanym elementem uwierzytelniania osób. Wraz z rozpowszechnieniem kryptografii zaczęły być wykorzystywane do parametryzacji algorytmów kryptograficznych, tak by możliwość odczytania utajnionej wiadomości była uzależniona od znajomości hasła.

Hasła współcześnie[edytuj | edytuj kod]

We współczesnych systemach kryptograficznych hasła są nadal powszechnie stosowane ze względu na to, że są mechanizmem najłatwiejszym w użyciu z punktu widzenia użytkownika oraz systemu teleinformatycznego. Hasła – rozumiane jako stosunkowo krótkie sekwencje liter, cyfr i innych znaków – mają następujące zalety, determinujące ich przydatność:

  • mogą być łatwo zapamiętane przez człowieka (w przeciwieństwie do kluczy kryptograficznych stosowanych we współczesnej kryptografii),
  • nie wymagają żadnego dodatkowego sprzętu ani sterowników (w przeciwieństwie np. do uwierzytelnienia biometrycznego czy kart elektronicznych),
  • są wprowadzane za pomocą tego samego interfejsu, który służy do komunikacji z użytkownikiem (zwykle monitor, wyświetlacz, klawiatura lub klawiatura ekranowa).

Wymienione cechy haseł wiążą się równocześnie z licznymi zagrożeniami, które muszą być brane pod uwagę podczas ich stosowania.

  • użytkownicy mogą wybierać hasła krótkie lub łatwe do złamania metodami słownikowymi,
  • hasła mogą zostać podsłuchane podczas transmisji sieciowej lub podglądnięte podczas wpisywania,
  • raz przechwycone hasło może być wykorzystywane do podszywania się bez wiedzy oryginalnego właściciela.

Problem nieautoryzowanego wykorzystania podsłuchanych lub złamanych haseł rozwiązuje się za pomocą haseł jednorazowych lub uwierzytelnienia dwuskładnikowego (ang. two-factor authentication) z użyciem tokenów, uwierzytelnienia biometrycznego i innych technik.

Hasła w kryptografii[edytuj | edytuj kod]

W systemach kryptografii klasycznej hasło mogło być stosowane do szyfrowania bezpośrednio (Szyfr Cezara) lub stanowić podstawę do generowania ciągu kluczowego (Szyfr Vigenère'a).

We współczesnych systemach kryptograficznych hasła nie powinny być nigdy stosowane bezpośrednio jako klucze kryptograficzne ze względu na stosunkowo niską entropię informacyjną haseł, a zatem możliwość skutecznego zaatakowania samego hasła o złożoności (entropii) np. rzędu 40 zamiast atakowania pełnego klucza kryptograficznego (np. o długości 128 bitów i takiej samej entropii).

Dla ograniczenia tego typu ataków hasła powinny zawsze podlegać dodatkowemu przetwarzaniu przed użyciem ich na wejściu do algorytmu kryptograficznego. Pierwsze tego typu przekształcenia zdefiniowano w 1998 roku w standardzie OpenPGP pod nazwą S2K (string to key)[1].

Współczesne funkcje stosowane do tego celu określa się nazwą PBKDF (Password Based Key Derivation Function) i zalecaną ich konstrukcję definiuje standard PKCS#5[2]. Funkcje PBKDF stosują dwa podstawowe zabiegi w celu zwiększenia złożoności ataku na hasło:

Błędy projektowe przy wyborze funkcji PBKDF mogą prowadzić do zmniejszenia faktycznego bezpieczeństwa zapewnianego przez oprogramowanie szyfrujące[3].

Proponowane są również nowe funkcje PBKDF, które mają na celu zapewnienie tej samej złożoności łamania haseł niezależnie od wzrostu mocy obliczeniowej komputerów w zakresie przetwarzania równoległego[4].

Hasła w uwierzytelnieniu[edytuj | edytuj kod]

Hasła są powszechnie stosowane przy uwierzytelnianiu użytkowników w systemach teleinformatycznych oraz elektronicznych instrumentach płatnicznych. W systemach teleinformatycznych wykorzystywane są jako tajny parametr, który potwierdza tożsamość zadeklarowaną przez użytkownika przez podanie identyfikatora. W elektronicznych instrumentach płatnicznych (np. karta płatnicza) stosowane są z reguły krótkie, numeryczne hasła określane nazwą kodów PIN.

System wykorzystujący do uwierzytelnienia hasła musi brać pod uwagę wszystkie wymienione wyżej zagrożenia. W szczególności systemy te powinny stosować następujące zabezpieczenia:

  • Polityka bezpieczeństwa wymuszająca wybieranie przez użytkowników haseł o odpowiedniej długości i złożoności, lub generowanie i przydzielanie im takich haseł.
  • Ograniczenie ilości prób uwierzytelenienia. Po przekroczeniu ustalonego limitu logowanie na dany identyfikator użytkownika jest blokowane na stałe lub czasowo. Jest to szczególnie istotne w przypadku haseł z założenia bardzo krótkich (PIN). Ograniczenie do trzech prób zapewnia wystarczającą ochronę przeciwko atakom automatycznym już dla haseł o entropii rzędu 20[5].
  • Bezpieczne przechowywanie haseł. Hasła w systemach teleinformatycznych są z reguły przechowywane w sposób uniemożliwiający ich odtworzenie, co chroni przed odtworzeniem dużej ilości haseł w przypadku uzyskania dostępu do bazy oraz umożliwia zapewnienie niezaprzeczalności działań użytkownika.

Do przekształcania haseł stosuje się algorytmy oparte na jednokierunkowych kryptograficznych funkcjach skrótu. Ze względu na możliwość prowadzenia skutecznych ataków (Atak słownikowy, Tęczowe tablice) na hasła przetworzone za pomocą pojedynczej funkcji skrótu konieczne jest stosowanie do tego celu funkcji przypominających funkcje PBKDF opisane w PKCS#5[2][6].

Obecnie najczęściej stosowanymi funkcjami skracania haseł jest NTLM (Windows), oparta na DES funkcja crypt (starsze systemy uniksowe), oparte na MD5 lub SHA-1 funkcje stosowane w Linuksie czy serwerze Apache oraz oparta na szyfrze Blowfish funkcja bcrypt (OpenBSD).

Niedoskonałe funkcje skracania haseł mogą prowadzić do znacznego obniżenia bezpieczeństwa danego systemu – w ten sposób podatna na złamanie jest stosowana w starszych wersjach Windows funkcja LMHash (Lan Manager Hash)[7] czy funkcja stosowana w starszych wersjach bazy MySQL (dwukrotne SHA-1 bez salt)[8].

Siła haseł[edytuj | edytuj kod]

Siła hasła pozostaje w ścisłym związku z ilością możliwych kombinacji i najprostszą jej miarą jest poziom entropii informacyjnej. Zależność tę obrazuje poniższa tabela:

Zestaw znaków Liczba znaków
w zbiorze
Hasło 8 znaków Hasło 16 znaków
Kombinacje Entropia Kombinacje Entropia
Cyfry (4 znakowy PIN) 10 10'000 13,28    
Litery bez rozróżnienia na duże i małe 26 2*10^{11} 37,54 4*10^{22} 75,08
Małe i duże litery 52 5*10^{13} 45,50 3*10^{27} 91,27
Małe, duże litery, cyfry 62 2*10^{14} 47,50 5*10^{28} 95,33
Małe i duże litery, cyfry, wszystkie

symbole na standardowej klawiaturze

95 7*10^{15} 52,63 4*10^{31} 104,98

Tabela pokazuje dane teoretyczne, które będą poprawne dla haseł generowanych losowo. Hasła wybierane przez ludzi mają tendencję do preferowania pewnych kombinacji – np. jednej dużej litery na początku i cyfr na końcu, lub budowania hasła na bazie słowa z języka naturalnego, co obniża rzeczywistą entropię takiego hasła. Może to ułatwić złamania takiego hasła, zwłaszcza jeśli zostaną użyte programy próbujące odtwarzać typowe zachowania użytkowników podczas wybierania haseł[9].

Wyrażenia hasłowe[edytuj | edytuj kod]

Ze względu na ograniczenie długości haseł do ośmiu znaków w niektórych starszych systemach operacyjnych dla uzyskania odpowiedniego poziomu entropii konieczne było generowanie haseł zawierających znaki z możliwie wielu różnych zestawów, co owocowało trudnymi do zapamiętania hasłami stanowiącymi pseudolosową mieszaninę liter, cyfr i symboli.

We współczesnych systemach, które akceptują hasła o długościach do 128 znaków, ten sam poziom bezpieczeństwa można osiągnąć za pomocą wyrażeń hasłowych (ang. passphrase, dla odróżnienia od password). Wyrażenia te na szeroką skalę zostały zastosowane np. w pakiecie PGP już na początku lat 90. Na przykład czternastoznakowe, ale nadal łatwe do zapamiętania wyrażenie „Litwo ojczyzno” ma wyższą entropię od ośmioznakowego hasła klasycznego składającego się z liter, cyfr i symboli.

W przypadku wyrażeń hasłowych wpływ na siłę hasła ma również liczba kombinacji i dobór symboli, jakimi są słowa. W przypadku typowego słownika opartego na języku naturalnym liczba słów wynosi od 8-10 tys. słów przy wykorzystaniu tylko łatwych do zapamiętania słów o maksymalnej długości 6 liter. Entropia każdego ze słów będzie wynosić około 13 i hasło o entropii informacyjnej powyżej 50 można uzyskać już przy czterech słowach (np. „infra aging allow ware”)[10], pod warunkiem, że są wybierane losowo. Wyrażenia wybierane przez człowieka rzadko osiągają entropię powyżej 30 bitów. W praktyce nawet jednak wyrażenia składające się z dwóch słów są w stanie zwiększyć entropię klasyczny haseł wymyślanych przez użytkowników z poniżej 10 bitów do ponad 20 bitów[11].

Generowanie haseł[edytuj | edytuj kod]

Najwyższą siłę haseł zapewnia generowanie losowe, które gwarantuje, że każdy znak będzie równie prawdopodobny. Równocześnie jednak hasłą wygenerowane losowo mogą być trudne do zapamiętania. Z tego powodu istnieje kilka powszechnie stosowanych mnemotechnicznych metod generowania haseł, nadal zapewniających stosunkowo wysoki poziom bezpieczeństwa[12]:

  • Wygenerowanie hasła z pierwszych liter łatwego do zapamiętania zdania – np. „No to co? Milszy mi jest pantofelek od ciebie ty safanduło!” da w wyniku hasło Ntc?Mmjpocts!.
  • Oparcie hasła o zdanie z wybranymi literami zamienionymi na znaki specjalne – np. „Litwo ojczyzno moja” na „L1tw0.0jczyzn0.m0ja”. Przy konieczności częstego generowania nowych haseł spójny system konwersji umożliwia łatwe zapamiętywanie kolejnych haseł.
  • Wyjście od dwóch łatwych do zapamiętania ale przypadkowych słów i zastosowanie wobec nich przekształceń – np. „bank” i „surowka” na „B@nkSur0wk@”.
  • Doklejanie do hasła wygenerowanego w powyższy sposób stałego lub zmiennego komponentu, zależnego np. od miesiąca, w którym generowane jest hasło czy znaki nie występujące normalnie w słowach (np. „Hasl0*004”, „Hasl0*005” itd).

Do generowania wyrażeń hasłowych o wysokim poziomie entropii można wykorzystać technikę Diceware, polegającą na wybieraniu kolejnych słów z odpowiednio ponumerowanego słownika za pomocą losowania ich indeksów za pomocą klasycznej sześciooczkowej kości do gry[13]. Słowniki dla Diceware są dostępne dla wielu języków, w tym dla języka polskiego[14].

Różne techniki generowania haseł i wyrażeń hasłowych są zaimplementowane w programach takich jak PWGen[15].

Przypisy

  1. RFC 4880: OpenPGP Message Format. IETF, 2007.
  2. 2,0 2,1 PKCS #5: Password-Based Cryptography Standard. RSA Laboratories.
  3. Acrobat 9 szyfruje inaczej niż wersja 8. SecurityStandard.pl, 2 grudnia 2008.
  4. Scrypt – propozycja nowej funkcji PBKDF. IPSec.pl, 5 czerwca 2009.
  5. Dinei Florencio, Cormac Herley, Baris Coskun: Do Strong Web Passwords Accomplish Anything?. 2007.
  6. Paweł Krawczyk: Ochrona i łamanie haseł w aplikacjach. Security Standard, 14 grudnia 2007.
  7. How to prevent Windows from storing a LAN manager hash of your password in Active Directory and local SAM databases. Microsoft.
  8. Password Hashing in MySQL. Sun Microsystems.
  9. Wordlist rules syntax. John The Ripper.
  10. Paweł Krawczyk: Bezpieczne hasła w XXI wieku. Security Standard, 26 czerwca 2009.
  11. Joseph Bonneau, Ekaterina Shutova: Linguistic properties of multi-word passphrases. University of Cambridge.
  12. Guide to Enterprise Password Management (draft). NIST, kwiecień 2009.
  13. The Diceware Passphrase Home Page.
  14. Piotr Tarnowski: Polski słownik dla Diceware.
  15. PWGen. Sourceforge.