Mimo postępu technologii, hasła nadal są najczęściej spotykanym mechanizmem uwierzytelniania. Nawet zakładając, że mechanizm, który ich używa nie ma żadnej słabości musimy zdać sobie sprawę, że jeżeli hasło ma skończoną długość (a trudno, żeby miało nieskończoną), to podejmując skończoną ilość prób, można hasło odgadnąć. Odgadywanie może polegać na jednej z metod:
- Po prostu wpisujemy hasło. Imię kota, później markę samochodu, datę urodzenia, abc123. I tak do skutku. Metoda nie jest specjalnie wyszukana, ale w praktyce przynosi niezłe efekty zwłaszcza, jeżeli atakujący zna osobiście atakowanego.
- Uruchamiamy automat, który pobiera ze słownika haseł (prosto ściągalne z Internetu) słowo po słowie i próbuje użyć ich jako hasła. Dobre słowniki mają kilkaset tysięcy haseł.
- Uruchamiamy automat, który używa haseł ze słownika, doczepiając im na końcu najbardziej typowe znaki takie jak 0, 123 czy wykrzyknik.
Uruchamiamy automat, który próbuje wszystkich kombinacji po kolei. aaaa, aaab, aaac, ..., zzzy, zzzz, aaaaa.... i tak dalej, do skutku. W informatycznym slangu, metoda ta nazywana jest "brute force".
Skuteczność tych metod jest różna. Jak powiedzie się metoda pierwsza, to znaczy że użyto zbyt trywialnego hasła albo, że atakujący miał dużo szczęścia. Atakującemu "ręcznie" zwykle znudzi się po jakimś czasie od minuty do godziny i prawdopodobnie się podda.
Automaty się nie nudzą a do tego są szybsze niż człowiek stukający w klawiaturę. Dla dobrego, powiedzmy, że złożonego z dziesięciu komputerów, automatu do łamania haseł, wydajność na poziomie 100000 prób na sekundę nie jest nieosiągalna.
Jak łatwo policzyć, słownik złożony nawet z miliona haseł zostanie sprawdzony w 10 sekund. Jeżeli zasób był zabezpieczony hasłem ze słownika, to w takim czasie zabezpieczenie zostanie złamane. Warto wiedzieć, że w słownikach są nie tylko "normalne" słowa, ale i typowe hasła takie jak qwerty123 czy 1qaz@WSX.
Jeżeli zastosujemy hasło składające się ze słowa słownikowego i doczepionego na końcu ciągu znaków (na przykład alamakota123) – czas łamania zależy od tego ile takich ciągów będzie sprawdzane. Typowo jest to kilkadziesiąt. To wystarcza. Przy założonej wydajności odgadywania, oznacza to, że hasło podda się w czasie kilkunastu minut. To nie jest dobre zabezpieczenie.
Ciekawiej robi się przy hasłach nie dających się odnaleźć w słowniku i nie zawierających w sobie dużych słów prosto ze słownika.
Jeżeli hasło składa się z samych małych liter – mamy do dyspozycji 26 znaków. Łamiąc takie hasło mamy:
- Dla hasła pięcioznakowego: 11881376 możliwości, czyli niecałe 2 minuty.
- Dla hasła sześcioznakowego: 308915776 możliwości, czyli niecałą godzinę.
- Dla hasła siedmioznakowego: 8031810176 możliwości, czyli prawie doba.
- Dla hasła ośmioznakowego: 208827064576 możliwości, czyli ponad 3 tygodnie.
- Dla hasła dziewięcioznakowego: 5429503678976 możliwości, czyli niemal dwa lata.
- Dla hasła dziesięcioznakowego: 141167095653376 możliwości, czyli około 44 lata.
Jak jasno widać – warto stosować długie hasło, ale bez sięgania po prawdziwe słowa. Jak wspomniałem wcześniej, hasła ze słownika łamane są w kilka sekund.
A jeżeli, zamiast stosować długie hasło z samych małych liter (takie jak asodczlkme) zastosujemy krótsze, ale złożone z liter dużych i małych (takie jak AsODcz)? Mamy do dyspozycji 52 znaki. Ilość prób i czas łamania wyniosą maksymalnie:
- Dla hasła pięcioznakowego: 380204032 możliwości – 1 godzina
- Dla hasła sześcioznakowego: 19770609664 możliwości – ponad dwa dni
- Dla hasła siedmioznakowego: 1028071702528 możliwości – niecałe cztery miesiące
- Dla hasła ośmioznakowego: 53459728531456 możliwości – 17 lat
- Dla hasła dziewięcioznakowego: 2779905883635712 możliwości – ponad 800 lat
- Dla hasła dziesięcioznakowego: 144555105949057024 możliwości – prawie 47 tysięcy lat
Choć można założyć, że w tym czasie komputery zwiększą (zgodnie z prawem Moore'a) swoją moc obliczeniową, to i tak trochę im to zajmie.
Wychodzi, że dziesięcioznakowe hasło złożone z dużych i małych liter (takie jak sKIrEcyeAk) jest całkiem dobrym zabezpieczeniem.
Kombinujmy więc dalej. Do dużych i małych liter dodajmy cyfry. Razem 62 znaki do dyspozycji. Jeżeli zechcemy takie hasło złamać metodami brute force, otrzymamy maksymalne czasy:
- Dla hasła pięcioznakowego: 916132832 – 2,5 godziny
- Dla hasła sześcioznakowego: 56800235584 – prawie tydzień
- Dla hasła siedmioznakowego: 3521614606208 – ponad rok
- Dla hasła ośmioznakowego: 218340105584896 – prawie 70 lat
- Dla hasła dziewięcioznakowego: 13537086546263552 – ponad 4000 lat
- Dla hasła dziesięcioznakowego: 839299365868340224 – ponad 260 tysięcy lat
Duże i małe litery połączone z cyframi (na przykład dE3F4R5aa1) dają już hasło całkiem przyzwoite i trudne do złamania.
W przypadku tak zwanych znaków specjalnych, sprawa nieco się komplikuje. wynika to z faktu, że o ile litera A jest mniej więcej tak samo często używana jak Z, a cyfra 1 jak cyfra 9, to znak ! czy . jest znacznie bardziej popularny niż na przykład znaki + { ; _ czy \.
Podstawowe znaki specjalne obejmują to, co dostępne jest przez Shift+cyfra: !@#$%^&*() oraz znak kropki. Rozszerzona lista obejmie dodatkowo wszystko to, co dostępne jest z prawej strony klawiatury. Można teoretycznie używać znaków "bardzo specjalnych" takich jak ™, ® czy €, ale wtedy pojawia się duże ryzyko, że jakiś system będzie je źle rozumiał lub wprowadzał w taki sposób, że uwierzytelnianie stanie się niemożliwe, więc lepiej ich unikać. Przyjmując, że podstawowych znaków specjalnych jest 11 a z rozszerzonymi łącznie 30, otrzymamy w końcu tabelkę:
| | Małe litery (26) | Małe i wielkie litery (52) | Litery i cyfry (62) | Litery, cyfry i podstawowe znaki specjalne (73) | Litery, cyfry i pełny zestaw znaków specjalnych (92) |
| 5 znaków | 2 minuty | godzina | 2 godziny | 5 godzin | 18 godzin |
| 6 znaków | godzina | 2 dni | 7 dni | 17 dni | 70 dni |
| 7 znaków | doba | 4 miesiące | 1 rok | 3 lata | 17 lat |
| 8 znaków | 20 dni | 17 lat | 70 lat | 255 lat | 1600 lat |
| 9 znaków | 2 lata | 800 lat | 4000 lat | 19000 lat | 150000 lat |
| 10 znaków | 44 lata | 47000 lat | 260000 lat | 1,3mln lat | 13mln lat |
Warto zwrócić uwagę, że mowa jest o czasach maksymalnych. Jeżeli atakujący będzie miał dużo szczęścia – zgadnie w pierwszej sekundzie. Utrudnić mu to można stosując taki zestaw znaków hasła, jakich na pewno nie zechce sprawdzać. Czyli coś w okolicach ostatniej kolumny tabelki.
Dla jasności, warto wspomnieć jeszcze co się stanie, jeżeli hasło zastąpimy kluczem o długości na przykład 128 bitów. Maksymalny czas łamania przez nasz automat wyniesie ponad 107902830708060141889705291 lat. Długo, zwłaszcza pamiętając, że wszechświat istnieje "tylko" 14000000000 lat
Warto pomyśleć jeszcze o zwiększaniu mocy obliczeniowej automatu zgadującego hasła. Komputerów na świecie jest dużo i jeżeli do pracy "namówimy" na przykład dziesięć tysięcy maszyn – czas łamania skróci się tysiąc razy w porównaniu z dziesięcioma komputerami założonymi na początku. To duży zysk, ale na przykład dla dziewięcioznakowego hasła ze znakami specjalnymi, oznacza w praktyce sto pięćdziesiąt lat nieprzerwanego liczenia. Czyli w praktyce nie ma się chyba czego obawiać.
Wszystkie te dywagacje opierają się na założeniu, że stosowane algorytmy nie mają znanych wad. Dla współcześnie stosowanych rozwiązań zazwyczaj jest to prawda, ale o niejednym algorytmie tak myślano i czas brutalnie rozwiał te nadzieje.
Jeżeli ktoś chce zweryfikować powyższe obliczenia, to przypomnę tylko, że zbiór odgadywanych haseł jest wariacją z powtórzeniami.
Autor: Grzegorz Tworek [MVP]