O hasłach maskowanych

Hasła są umiarkowanie bezpieczną metodą uwierzytelnienia użytkownika. Nie chodzi tu nawet o fakt, iż znaczna część populacji wybiera hasła słabe. Hasło może zostać podsłuchane lub podpatrzone. Podsłuchane za nawet nie tyle za pomocą sniffera w trakcie, gdy hasło przesyłane jest przez sieć, ale przez keylogger (lub ogólniej – malware) w trakcie jego wpisywania. Podpatrzone przez osobę, która niewinne stoi akurat za plecami i spogląda niewinnie gdzieś w dal...

Palący problem...

Haseł nie można jednak skutecznie zastąpić inną metodą uwierzytelnienia. W niewielkiej skali oczywiście jest to możliwe, ale oczekiwanie, że 100%25 użytkowników bankowości elektronicznej zacznie używać na przykład podpisu elektronicznego z kluczem prywatnym umieszczonym na karcie kryptograficznej, to czysta naiwność. Z tego powodu “zwykłe hasła” zostały nieco ulepszone. Chodzi mi o hasła “maskowane”. Zasada jest prosta, użytkownik musi podać jedynie kilka znaków z hasła, o które prosi system. Atakujący nie może wykorzystać zdobytej (podsłuchanej lub podpatrzonej) części hasła do uwierzytelnienia się do systemu. Jest to prawda wyłącznie wtedy, gdy atakujący nie ma możliwości podsłuchania większej ilości prób logowania. I tu pojawia się bardzo ciekawe pytanie – ilu?

...jak się do tego zabrać...

Pierwsze podejście do rozwiązania tematu przy pomocy narzędzi matematycznych nieco mnie przerosło. Zresztą nie chodzi o wskazanie wzoru, lecz raczej o określenie rzędu wielkości. W takich przypadkach świetnie się sprawdza statystyka. W związku z tym napisałem mały skrypt, który wykonuje następujące operacje:

Jest to bardzo, bardzo uproszczony model, ale na początek wystarcza. Dodatkowo przyjąłem, że długość hasła użytkownika zamyka się w zakresie od 8 do 16 znaków, natomiast sprawdzane wartości długości maski (ilość koniecznych do podania znaków z hasła) to wartości 4, 5, 6 i 7.

...wyniki...

Jak wyglądają (przykładowe) wyniki pokazałem niżej. Przypominam, że są one rezultatem prostego eksperymentu opartego w znacznym stopniu na funkcji random i mogą nie odpowiadać teorii. Dla przykładu choć przy 4 znakowej masce teoretycznie wystarczą 3 próby do poznania pełnego hasła, to częściej wymagane są jednak 4 próby. W przypadku 8 znaków hasła i 4 znaków maski ta sama wartość wynikająca z eksperymentu odpowiada wartości teoretycznej i wynosi 2.

Co oznaczają poszczególne wartości? Dla każdego przypadku przeprowadzone zostało 1000 prób. Wynikiem każdej próby jest numer kroku, w którym poznane zostało pełne hasło. Wartość średnia to po prostu średnia arytmetyczna. Ile zwykle było potrzebnych prób oznacza po ilu krokach najczęściej pełne hasło zostało poznane. Wartość minimalna i maksymalna oznacza najlepszy i najgorszy przypadek, czyli minimalną i maksymalną ilość prób potrzebną do poznania pełnego hasła.

Co wynika z tego eksperymentu? Po pierwsze im dłuższe hasło, tym lepiej. Po drugie im krótsza maska, tym lepiej. I jednego i drugiego można się było spodziewać. Bardziej istotny jest fakt, że wartości średnie tylko przy długich hasłach i krótkich maskach przekraczają 10. Należy się spodziewać, że hasło zostanie poznane już przy 4-7 próbach. Czy to dużo? Nie. Na pewno za mało, by hasła maskowane traktować jako ochronę przed wrogim oprogramowaniem. Sprawdzać się mogą w przypadku sporadycznego korzystania z niezaufanych komputerów lub sporadycznego spotkania się ze szpiegiem podpatrującym proces wpisywania hasła, choć odnośnie tej drugiej ewentualności mam pewne wątpliwości. Dlaczego? Gdy mam wpisać “zwykłe” hasło, to wpisuje je z szybkością kilkudziesięciu znaków na minutę. W przypadku hasła maskowanego szybkość jest znacznie niższa, co według mnie poważnie ułatwia podpatrzenie wpisywanych znaków...

...ale po co pełne hasło...

Wpadłem również na pomysł innego testu. Atakujący w sumie nie potrzebuje posiadania całego hasła, lecz wystarczającej ilości jego elementów, by móc prawidłowo uzupełnić kolejną maskę. Co się okazuje? Że średnio wystarczy od 3 do 5 prób, minimalnie są to 2 próby. Nawet dla długich (16 znaków) haseł i krótkich (4 znaki) masek średnio potrzebne jest do tego 5 prób, co niweluje 13 prób potrzebnych do poznania pełnego hasła.

A może by tak...

Przypominam, mój model symulacji był bardzo uproszczony. Generowane były wszystkie możliwe maski, sprawdzane były losowo. Zastanawiam się, czy to ma jednak jakieś większe znaczenie. Dlaczego? Są dwie sytuacje, w których atakujący na podstawie poprzednio występujących masek, może z powodzeniem dokonać uwierzytelnienia:

Jeśli zaimplementowany zostanie mechanizm, który będzie starał się generować odległe od siebie maski, wówczas w kolejnych maskach szybciej będą wymagane wszystkie znaki hasła. Jeśli z kolei maski będą bliższe sobie (bardziej podobne), to odpytanie o wszystkie znaki hasła co prawda nastąpi później, jednak wcześniej pojawi się sytuacja, w której wszystkie znaki kolejnej maski wystąpiły we wcześniejszych próbach.

O jejku jejku!

Czy to oznacza, że hasła maskowane powinny odejść do lamusa? Nie koniecznie. Są dobrym rozwiązaniem jeśli rozpatruje się je jako środek zmniejszający zagrożenie wynikające ze sporadycznego podsłuchania (podejrzenia) wpisywanego hasła. A najlepiej jest przyjąć, że w tym przypadku sporadycznie oznacza jednokrotnie i po takiej “wątpliwej” sytuacji (niezaufany komputer, ktoś obcy za plecami) zmienić hasło na nowe, oczywiście już w bezpiecznym środowisku.

Oryginał tego wpisu dostępny jest pod adresem O hasłach maskowanych

Autor: Paweł Goleń