Blog
Czy Twoje hasło wyciekło? Część teoretyczna.
Wojciech Stróżyński 01.04.2019
Dziś o komputerach, hasłach i internetach! W pierwszej części dowiemy się czegoś o hasłach i sposobach ich przechowywania. Dowiemy się jak sprawdzić, czy nasze dane są bezpieczne.
W drugiej części napiszemy prosty skrypt w Pythonie i wykorzystamy internetowe API do bezpiecznego sprawdzenia naszego własnego hasła.
Czy moje hasło już kiedyś wyciekło? Sam czasami zadawałem sobie to pytanie, ale tak naprawdę skąd mam to wiedzieć? I czy to jest dla mnie jakiekolwiek zagrożenie? Otóż jest.
Co jakiś czas dochodzi do złamania zabezpieczeń serwisów i na światło dzienne wychodzą bazy danych na przykład klientów portalu. Z takich wycieków budowane są później bazy haseł, adresów email i kto wie czego jeszcze. Adresy można wykorzystać na 1000 sposobów. Dysponując adresem i hasłem do naszych kont można zbierać o nas bardzo duże ilości danych. Bo przecież ilu z nas loguje się do portali tym samym adresem email i tym samym hasłem? No z pewnością paru z nas tak robi.
Na szczęście minęły już czasy, kiedy hasła w bazach danych były trzymane w postaci tekstowej. Z haseł, które wyciekły w formie tekstowej można było łatwo przygotowywać słowniki, wykorzystywane później w atakach. Obecnie trzymane są nie hasła jako takie, ale funkcje skrótu z haseł. Tym samym żeby odczytać nasze hasło po wycieku trzeba najpierw znaleźć to, które daje taki sam wynik funkcji skrótu jak nasze hasło. Co już takie łatwe nie jest. Wypadałoby by w tym momencie wyjaśnić czym owa funkcja skrótu jest i do czego w ogóle jest nam potrzebna.
Co to jest ta funkcja skrótu (funkcja haszująca)
Cytując za wikipedią:
Funkcja skrótu, funkcja mieszająca lub funkcja haszująca – funkcja przyporządkowująca dowolnie dużej liczbie krótką, zawsze posiadającą stały rozmiar, niespecyficzną, quasi-losową wartość, tzw. skrót nieodwracalny.
Czyli w dużym skrócie jest to wartość uzyskana z dowolnie dużego zbioru danych, która jest stałego rozmiaru, a co najważniejsze jest jednostronna – to znaczy nie da się z jej wyniku uzyskać danych przekazanych na wejściu funkcji haszującej. Oczywiście w zależności od funkcji haszującej możliwe są ataki kryptograficzne ułatwiające znalezienie danych wejściowych. To jest jednak temat zbyt złożony na dzisiejszy artykuł. Jest jednak jeden prosty, ale bardzo czasochłonny sposób, żeby owe dane znaleźć.
Najprostszym sposobem jest wzięcie bazy haseł, wyliczenie z nich funkcji skrótu i sprawdzenie, czy funkcja skrótu z szukanego hasła jest na liście wygenerowanej przez nas z bazy haseł. Oczywiście wymagałoby to posiadania listy funkcji skrótu ze wszystkich możliwych kombinacji, co jest praktycznie niemożliwe z uwagi na liczbę możliwości. Niemniej jednak są tworzone słowniki wartości skrótu do haseł, które już wyciekły. Jeśli wasze hasło znajduje się na takiej liście, to dysponując funkcją skrótu da się dojść do tego, jakiego użyliśmy hasła. Dlatego tak ważne jest to, żeby hasło było unikalne.
Sumy haszujące są wykorzystywane w informatyce bardzo często. Na przykład jako sumy kontrolne potwierdzające poprawność danych. Zmiana jednego bitu w danych wejściowych (na przykład obrazie płyty CD) spowoduje wygenerowanie sumy kompletnie innej, niż zostałaby wygenerowana z poprawnych danych. Za to dwa identyczne pliki dadzą zawsze dwie identyczne wartości funkcji skrótu. To bardzo ważna cecha.
To co, moje hasło wyciekło?
Nie wiem ¯\_(ツ)_/¯
Ale wiem jak to sprawdzić!
Jeśli interesowaliście się wyciekami danych to pewnie trafiliście na stronę https://haveibeenpwned.com a jeśli nie, to serdecznie ją polecam. Człowiek, który za nią stoi gromadzi wszystkie dane i wrzuca je do wielkiej bazy danych. Twierdzi jednak, że robi to dla naszego dobra. I ja mu nawet wierzę. Strona pozwala dodać swój mail. Dzięki czemu w razie znalezienia danego adresu w nowych wyciekach danych zostaniemy o tym przez autora poinformowani. Możemy też sprawdzić, czy do tej pory nasz adres email pojawił się już w jakichś wyciekach, a nawet sprawdzić czy kiedykolwiek wyciekło hasło, którego używamy!
Hasło wystarczy wpisać na tej stronie. Po prostu wpisujemy je w jednym z okienek i klikamy sprawdź. Twoje hasło leci w nieznanej postaci do nieznanego serwera, a ten odpowiada, że wszystko jest ok, lub hasło wyciekło. Zapaliła się czerwona lampka ostrzegawcza? Powinna.
Czego nie robić w Internecie?
I o ile podawanie adresu email na w miarę zaufanej stronie nie jest takie złe, o tyle o tyle wpisywanie hasła w jakiekolwiek okienko powinno zawsze spowodować, że odruchowo sprawdzacie, czy połączenie jest szyfrowane, czy adres się zgadza, czy certyfikat jest wiarygodny. Najlepiej dwa razy.
Nasze hasło mogło być używane nie tylko przez nas. Wiem. To brzmi dziwne, ale ktoś może posługiwać się takim samym hasłem jak my. Sprawdzając wycieki zawierające nasz email sprawdzamy tylko część potencjalnych zagrożeń. W ten sposób nie jesteśmy w stanie potwierdzić tego czy nasze hasło nie znajduje się w ogromnych słownikach haseł.
Cóż. Możemy też zaryzykować i wpisać nasze hasło, na jakiejś losowej stronie w Internecie i wierzyć, że go nie zapisze w swojej bazie i nie odpowie po prostu, że jest bezpieczne. Kiedyś były strony sprawdzające, czy wyciekły dane naszej karty kredytowej. Wystarczyło wpisać jej numer, datę ważności i kod CVV i mieliśmy pewność… że dane naszej karty właśnie wpadły w ręce złodziei.
Na szczęście możemy zrobić coś, co doskonale nada się na proste zadanie programistyczne. Ta strona udostępnia bowiem API (Nie no, tego już nie będę tłumaczył). W dodatku pisząc samemu skrypt mamy pełną kontrolę nad tym, co się z danymi dzieje i co wysyłamy do internetu. Sam skrypt będziemy pisali w drugiej części artykułu, ale już teraz możemy zobaczyć czym jest api, oraz jak wygląda to konkretne, pozwalające nam na sprawdzenie, czy nasze hasło wyciekło.
API – wstęp
Wiemy, że nie możemy wysłać naszego hasła tak po prostu. Wiemy też, że nie możemy wysłać całej wartości funkcji skrótu, bo jeśli ta wartość będzie znana, to i nasze hasło będzie znane. Co możemy więc zrobić? Sprawdźmy jak w sprytny sposób obchodzi ten problem API tej strony.
Dokumentacją API możemy znaleźć TUTAJ Dzięki niemu jestśmy w stanie w stanie wywołać zapytanie, które będzie zawierało tylko szczątkowe dane. Konkretnie będzie to pięć pierwszych znaków funkcji skrótu naszego hasła. W zamian strona odpowie nam kolekcją funkcji skrótu z takim samym początkiem i wartością informującą o tym ile razy dane hasło pojawiło się w bazie danych. To dobry kompromis. Dostaniemy około 550 kluczy, które teraz będziemy musieli przeszukać już na własną rękę. Czym jednak jest zbiór 550 kluczy do sprawdzenia przy całej bazie danych zawierającej dane z 7761152394 kont, które wyciekły? Moglibyśmy to zrobić ręcznie. Nic nie stoi na przeszkodzie, żeby już teraz pobawić się api. Wystarczy na przykład wpisać /12345 jako pięć pierwszych znaków sumy kontrolnej. Serwer powinien nam coś odpowiedzieć. Szerzej jednak api będę omawiał w drugiej części artykułu.
Co potrzebuję do tego Pythona?
Będziemy potrzebować działające środowisko i jakiś edytor tekstu. TUTAJ znajdziesz informację jak to zrobić pod Windowsem. Linux praktycznie zawsze ma to wsparcie już wbudowane.
Do tego przyda się jeszcze wiedza o tym czym jest słownik (kontener asocjacyjny). No i może wypadałoby napisać jakiś prosty program w Pythonie.
W następnej części dowiemy się jak prostym skryptem przyspieszyć sobie sprawdzanie haseł wszystkich członków rodziny. Może to będzie dobra okazja, żeby nauczyć się nowego języka, albo wrzucić jakiś projekt na prywatnego Githuba? Praktyka czyni mistrza!