Hasła

7 Maja 2017

Każdy z nas używa haseł jako mechanizmu uwierzytelniania (logowania, “authentication”) na setkach portali internetowych. Dużo się mówi o tym, że hasło powinno być bezpieczne. Ale wiele ludzi, w tym ja do niedawna, nie przejmuje się takimi detalami…

W tej historii opowiem wam jak w ciągu kilku godzin zmieniłem moje nastawienie do haseł i podam kilka rad jak być bezpieczniejszym w sieci.

Wszystko zaczęło się kilka dni temu kiedy dostałem maila od portalu HipChat, mieli incydent i ktoś miał nieupoważniony dostęp do danych użytkowników. Inne produkty grupy Atlasian nie zostały podobno naruszone, ale ponieważ jest jedno konto na je wszystkie, to zresetowano mi hasło (t.j. dostałem link i miałem sobie zmienić hasło na nowe). Więcej o tym możecie przyczytać na ich blogu.

Zresetowałem hasło, ale jeszcze nie zacząłem się martwić. W mailu napisali, że przechowywali hasła w postaci hashu utworzonego przez algorytm bcrypt z losowym saltem. Czas co nieco wyjaśnić.

Jak działa logowanie do portali internetowych?

Każdy portal przechowuje dane o użytkowniku w bazie danych. Żeby zalogować się, użytkownik podaje login i hasło. Jeśli portal przechowywałby hasło w bazie czystym tekstem, to w wypadku włamania, atakujący ma dostęp do loginów, emaili i haseł użytkowników. Oznacza to, że może za pomocą tych danych zalogować się do innego portalu, gdzie użytkownik ich użył. Dlatego mądrzy ludzie wpadli na pomysł, żeby nie przechowywać w bazie haseł, tylko pewien hash. Hash to wynik funkcji hashującej. Funkcje hashujące to funkcje jednostronne, co oznacza że z hasła możemy dostać hash, ale z hasha nie dostaniemy hasła. Może być też tak, że funkcja hashująca przyporządkuje ten sam hash kilku hasłom, mówimy wtedy o kolizjach. Im mniej kolizji tym lepiej, bo tym mniejsza szansa, że zalogujemy się niewłaściwym hasłem (choć mającym ten sam hash).

Przykład wyniku hashowania algorytmem MD5

Text            Hash
Hello World!    8ddd8be4b179a529afa5f2ffae4b9858

Są różne algorytmy hashowania. Za stare i mało bezpieczne uznaje się m.in. MD5 i SHA-1. Więc obecnie używa się raczej SHA-256, bcrypt, PBKDF2, scrypt.

Do tego dochodzi sól (salt). Żeby utrudnić poznanie faktycznego hasła użytkownika, to na koniec dopisujemy pewien losowo wygenerowany ciąg znaków. Sól jest jedna dla użytkownika i przechowywana razem z nim w bazie danych.

Ale nawet dobra funkcja hashująca i sól dają niewiele, kiedy zostaną zaaplikowane tylko jeden raz. Dlaczego? Ponieważ prawda jest taka, że żaden hash nie jest nie do złamania za pomocą brute-force’a. Ale od złożoności czasowej zależy jak szybko się to stanie (jutro, za miesiąc, za 100 lat). Dlatego hashuje się wielokrotnie (rzędu kilku do kilkudziesięciu tysięcy iteracji), żeby spowolnić crackera.

HaveIbeenPwned?

Od dłuższego czasu obserwuję Troya Hunta na twitterze, specjalistę od biezpieczeństwa, który założył serwis Have I been pawned?. Ideą serwisu jest powiadamianie ludzi gdy ich email/login pojawi się w wycieku danych z jakiegoś portalu. Oprócz tego Troy opisuje wszystkie te wycieki na swoim blogu ze szczegółami jak nad nimi pracuje. Dodatkowo można zapisać się na powiadomienie, kiedy twój email gdzieś wycieknie. Dzięki temu wiem, że mój email pojawił wraz z hasłem w wycieku pod nazwą “Exploit.in”.

Ale, ale, z hasłem? Przeczytwaszy artykuł na blogu o tym wycieku, doszedłem do wniosku, że faktycznie jest duża szansa iż pojawiło się tam moje hasło. Ponieważ używam tego samego hasła do większości usług to nieźle się przeraziłem. Patrząc na komentarze, jest duża szansa, że jest to zlepek starych wycieków, więc prawdopodobieństwo, że chodzi o moje jedno konkretne hasło wzrosło (od pewnego czasu używałem też drugiego mocniejszego).

Nie mniej jednak się zaniepokoiłem. Postanowiłem wejść na każdą stronę gdzie jestem zarejestrowany i zmienić moje stare hasło na nowe.

Bezpieczne hasło

Kiedy mamy do czynienia z atakiem brute-force, czyli idziemy po wszystkich możliwych kombinacjach znaków, to jedyną obroną (spowolnieniem) jest zastosowanie hasła długiego. Załóżmy, że korzystamy w naszym haśle tylko z liter łacińskich, cyfr i znaków nad cyframi w klawiaturze QWERTY. Wtedy dla hasła o długości 8 znaków (wiedząc że ma 8 znaków) musimy sprawdzić (2*26+2*10)^8 = ~7,2 * 10^14 haseł. A im dłuższe hasło i im więcej możliwych znaków (w tym znaków Unicode) tym więcej możliwości.

Ale crackerzy rzadko korzystają od razu z metody brute-force. Najpierw korzystają z metody słownikowej. Czyli mają plik z hasłami np. 1000 najpopularniejszych haseł. Więcej słowników (więc haseł, jakich nie pownniście używać), znajdziecie tu SecLists/Passwords. No i próbują te hasła oraz ich pochodne (zamiana małej litery na dużą, e na 3, itp.). Jak widać kombinacji jest znacznie mniej niż przy ataku brute-force, a szansa na szybkie trafienie jest większa.

Więc co jest zalecane? Hasła z dużą entropią (czyli nieprzewidywalne), takie jak np. $w#js8@n1+;u, nie pojawią się w ataku słownikowym. Ich jedyna wada - nie da się łatwo zapamiętać, ani potem wpisać.

Więc dobrą opcją jest stworzenie hasła, które będzie można obliczyć w głowie za pomocą pewnej funkcji, której wejściem jest np. witryna, do której hasło próbujemy wymyślić. Podam prosty przykład, z którego nie powinniście już korzystać. Ta funkcja powinna być znana tylko wam.

fun strona ->
    "$" + reverse(strona) + "#" + strona.length()

W ten sposób hasłem do portalu pudelek.pl będzie np. $lp.keledup#10. Najważniejsze w tej funkcji jest to, że jeśli ktoś wasze hasło odkryje, to żeby nie mógł łatwo wpaść na nią, bo wtedy stosując ją do innych portali może się wam włamać na konto.

No i koniecznie, nie używamy tego samego hasła na kilku portalach!

Przechowywanie haseł

Kiedy chcemy być bardzo bezpieczni i zdecydujemy się na kompletnie losowe hasła jak $w#js8@n1+;u albo po prostu nie mamy głowy do pamiętania tych haseł, to użyjemy narzędzia do przechowywania haseł.

Przykładem takich narzędzi są KeePass, LastPass, 1Password i Enpass, z którego ja postanowiłem skorzystać.

Idea jest prosta, zapisujemy hasła w aplikacji, która bezpiecznie je przechowuje (zaszyfrowane). Do tego mamy dodatek do przeglądarki, bądź integrację aplikacji z systemem operacyjnym, co pozwala nam szybko i skutecznie się logować. Dodatkowo dostajemy generator losowych haseł.

Podsumowanie

Mimo, że od dawna wiedziałem o tym jak ważne jest mieć bezpieczne hasło, to jakoś średnio mnie to interesowało. Kwestia wygody. Jednak teraz spędziłem kilka godzin na zmienianiu haseł we wszystkich portalach powiązanych z emailem, który pojawił się na HaveIbeenPwned i zaczynam brać bezpieczeństwo bardziej pod uwagę.

Zachęcam i ciebie! Przeznacz jeden weekend na zabezpieczenie się przed potencjalną utratą danych, gdy ktoś wykradnie twoje hasło. Dodatkowo, zapisz się na HaveIbeenPwned.com/NotifyMe, żeby dostać maila kiedy twoje dane wyciekną.