Ostatnio coraz więcej piszę o gafach polskich serwisów (patrz poprzednie wpisy). Nadszedł czas, aby napisać kilka słów o hashowaniu haseł użytkowników w bazie danych. Z moich doświadczeń wynika, że na polskim rynku możemy natknąć się na strony internetowe, których administratorzy przechowują hasła w postaci jawnego tekstu. Zjawiskiem tym warto się zainteresować i zwracać na nie uwagę, gdyż występuje nawet w przypadku „grubszych ryb”.
Problem znany?
Jak się okazuje tak. Wystarczy zapytać google o „hasła plaintext„, „nieszyfrowane hasła„, „jawne hasła w bazie danych„, a otrzymamy masę wyników z informacjami o stronach, których administracja z jakiegoś powodu nie lubi funkcji skrótów. Swojego czasu Zaufana Trzecia Strona stworzyła spis takich stron.
Skąd wiadomo, czy witryna hashuje hasła?
Jeśli jest to ogólnodostępny CMS, możemy zainstalować jego kopię na naszym serwerze i sprawdzić samemu. Jeśli skrypt jest autorski, wtedy warto o to zapytać. Załóż konto w interesującym Cie serwisie i skorzystaj z funkcji przypomnienia hasła. Jeśli dostaniesz wiadomość email z Twoim hasłem w czystej postaci oznacza to, że nie jest ono hashowane. W ekstremalnych przypadkach może być co najwyżej szyfrowane odwracalnym algorytmem (np. Base64).
Historia z życia wzięta
Prawie rok temu zapomniałem mojego hasła do panelu serwisu LinkMe.pl. Skorzystałem z wcześniej wspomnianej funkcji przypomnienia hasła, po czym dostałem je w czystej postaci. Zapytałem Administratora czy tak na pewno powinien działać system. Nie musiałem długo czekać na odpowiedź.
Nie było takiej potrzeby, do bazy ma dostęp jedna osoba, baza jest bardzo dobrze zabezpieczona. Tak zostało jeszcze z początkowych lat działalności systemu.
Tak czy inaczej – ma Pan racje, powinno być to tak czy inaczej dodatkowo zabezpieczone.. Wkrótce zrobimy to.
Poprawka w skrypcie została wprowadzona w przeciągu dwóch dni od otrzymania zgłoszenia (Administratorzy, bierzcie przykład!). Faktem jest, że nikt niepowołany nigdy nie uzyskał dostępu do wspomnianej wcześniej bazy danych. Zastanówmy się jednak co by się stało, gdyby wyciekła?
Naprawdę warto kłaść duże znaczenie na sposób przechowywania haseł w bazie i dbać o to już podczas projektowania serwisu.
Jak przechowywać hasła w bazie?
- md5() to za mało.
- sha1() to też za mało.
- sha1() + salt? Nieźle, ale można lepiej
- sha1() + salt + salt dynamiczny
$haslo = sha1(„haslo”.$salt.$salt_dynamic); //od razu lepiej
Salt (ang. sól) sprawia, że hasło jest cięższe do złamania. Najlepiej, gdy solą jest ciąg ~30 losowo wygenerowanych znaków. Dodatkowo każdy z użytkowników powinien mieć przypisaną sól dynamiczną (tak samo, 30 losowo wygenerowanych znaków). Można także pomyśleć nad zastosowaniem klasy takiej jak Bcrypt.
„Jeśli dostaniesz wiadomość email z Twoim hasłem w czystej postaci oznacza to, że nie jest ono hashowane.”
To zdanie akurat niekoniecznie jest prawdziwe.
Czyżby? Prosiłbym o rozwinięcie Twojej wypowiedzi.
No tak sie sklada, ze nic nie stoi na przeszkodzie by najpierw witryna wyslala do ciebie maila z niezhashowanym haslem, a nastepnie zapisala je w zhashowanej wersji w bazie danych.
Albo coś źle przeczytałeś, albo ja coś źle napisałem. W wpisie jest mowa o przypomnieniu hasła, a nie jego wysłaniu podczas rejestracji.
Lepsze niż SHA1 jest bcrypt…