Kto nie szyfruje ten trąba

Jak wiele serwisów, w których założyłeś konto, nie szyfruje twoich haseł?

Niewiele? Wiele? A może bardzo wiele? Wydawać by się mogło, że serwisy www przechowujące w swoich bazach jawnie zapisane hasła, to jedynie margines internetu. Bo któż, kto nie ma niecnych zamiarów, naraża swoich użytkowników na poważne niebezpieczeństwo?

Jednak po ostatnich aferach związanych z wyciekiem haseł na Wykopie, akcji “Bezpieczne konto” na Allegro czy sprawie związanej z dostępnością haseł na platformie Istore (pisał o tym E-Komers) okazuje się, że nawet poważni gracze pozwalają sobie na niepoważne zachowanie. Co więcej, okazuje się, że nie tylko ci najwięksi: podczas przeprowadzanego niedawno audytu średniej wielkości serwisu, natrafiłem w nim na podobną przypadłość. Serwis napisany stosunkowo poprawnie, zabezpieczony przed typowymi atakami, ale obsługa haseł zrealizowana wybitnie nieprawidłowo. I nie był to pierwszy raz, gdy stwierdziłem tego typu zaniedbanie. Tak więc poniżej krótkie przypomnienie dla projektantów, project managerów i inszych programistów. Ludzie, to są podstawy!

Zagrożenia jakie niesie za sobą przechowywanie haseł w formie jawnej:

1. Administrator serwisu, administrator serwera oraz prawie każdy programista zajmujący się utrzymaniem czy rozbudową serwisu otrzymują nieskrępowany wgląd w hasła użytkowników.

2. Istnieje możliwość wycieku haseł na wskutek włamania czy kradzieży bazy danych.

3. Istnieje możliwość wycieku haseł w wyniku błędu oprogramowania.

4. Istnieje możliwość wycieku haseł w wyniku błędnej konfiguracji serwera, np. gdy inny użytkownik bazy danych otrzyma uprawnienia do przeglądania cudzych zasobów.

5. Istnieje możliwość przechwycenia hasła wysyłanego w mailu – efekt nieprawidłowo zrealizowanej funkcji “Przypomnij hasło”.

Czy szyfrowanie haseł algorytmem dwustronnym zwiększa bezpieczeństwo?

Tak, ale tyle co nic. :) Jest wielce prawdopodobne, że włamując się na serwer hacker zdobędzie również informacje potrzebne do odszyfrowania haseł. Powiedzmy zresztą sobie jasno – w 99.999% przypadków serwisów webowych nie ma takiej potrzeby, aby hasło użytkownika mogło być odczytane w oryginalnej postaci. Nie ma i basta.

Jak mantrę należy więc powtarzać podstawowe zasady:

1. Hasła szyfrujemy algorytmem jednostronnym (generujemy skrót MD5 czy SHA) i tylko w takiej postaci przechowujemy je w bazie.

2. W celu zapobieżenia wykorzystaniu przez włamywacza Rainbow Tables w łamaniu haseł metodą Brute Force, przed utworzeniem skrótu hasła dodajemy do niego tzw. salt, czyli przypadkowy ciąg znaków przechowywany gdzieś poza samą bazą danych.

3. Nie wysyłamy hasła w poczcie email, nawet zaraz po rejestracji. Użytkownicy nie kasują takich wiadomości, przez co ich hasła stają się podatne na zdobycie w kolejny sposób (atak na skrzynkę pocztową).

4. Funkcję “przypomnij hasło” najbezpieczniej jest zrealizować poprzez generowanie unikalnego linku (z trudnym do odgadnięcia identyfikatorem – np. z użyciem funkcji uniqid w PHP), którego ważność jest ograniczona czasowo do np. 3 godzin. Wygenerowany link wysyłamy na adres email zarejestrowany w serwisie. Po jego kliknięciu użytkownik uzyskuje możliwość wpisania nowego hasła do swojego konta.