Bezpieczeństwo haseł Idea prezentacji Bezpieczeństwo haseł w tworzeniu serwisów internetowych Bezpieczeństwo nie istnieje bez użytkownika Hasła tworzą użytkownicy nie administratorzy czy programiści Tworzenie serwisu internetowego to wieczna walka z jego użytkownikami (wykład z BwSK) Bezpieczeństwo haseł - Konspekt jak użytkownicy tworzą hasła jakie hasła tworzą co z tego wynika jak zrobić, żeby było dobrze jak stracić użytkowników MD5, łamanie, tęczowe tablice, salt The journey begins Wymagania odnośnie haseł: 1. brak (min. długość 5 znaków) 2. przynajmniej jedna cyfra i przynajmniej jedna duża litera Które rozwiązanie lepsze? Ilość kombinacji hasła o określonej długości to nic innego jak wariacje z powtórzeniami, wzór: V n k = k n Hasła z samych małych liter pięcioznakowe: 26 5 = 11 mln kombinacji Hasła z małych i dużych liter, oraz cyfr, sześcioznakowe: (26+26+10) 6 = 62 6 = 57 mld kombinacji 1
Wymóg cyfry w haśle: Gdzie trafi ta cyfra? Jaka to będzie cyfra? Wymóg dużej litery w haśle: Gdzie trafi ta litera? do 90% do 95% Jakie są najczęściej używane hasła w Polsce? asdf, qwerty, 12345, qwe123 lol, ziomek, ganja, naruto polska, komputer, dragon, plemiona popularne imiona Ilość kont `chronionych` każdym takim hasłem potrafi sięgać 1% wszystkich kont w serwisie. Zablokowaliśmy możliwość używania wszelkich haseł zawierających: `qwe`, `asd`, `123`. Rezultat? zaq12wsx Saga continues Zablokowaliśmy wszelkie kombinacje: `qaz`, `zaq`, `wsx`, `xsw`. Walka trwa, runda trzecia: zxcvb Natura nie cierpi próżni! Ciekawe co dalej 2
Jak więc walczyć z użytkownikami o lepsze hasła? Jak nie stracić przy tym użytkowników? Celem każdego serwisu internetowego jest pozyskiwanie użytkowników. Zazwyczaj zarejestrowanych użytkowników. ergonomia haseł = ergonomia rejestracji Znaj proporcjum, mocium panie! Różne serwisy potrzebują różnych poziomów zabezpieczeń, w tym wymagań od haseł. Bank: Serwis z danymi osobowymi: Przeciętny serwis www: bardzo wysoki dość wysoki średni / niski Po pierwsze: prostota! Próba rozwiązania: Chęć użytkownika do zarejestrowania się w naszym serwisie jest ograniczona kłodami jakie rzucimy mu pod nogi. Jest kilka, kilkanaście innych serwisów w internecie, które oferują dokładnie to samo! http://www.rd2.cz/reg/shr.php?ln=1 Rejestracja podzielona na kroki Każdy krok prosty i krótki Czytelne strzałki do przodu Komunikaty do wszystkiego co trzeba zrobić Opisy do wszystkiego co trzeba wybrać Wydawało się działać super... Rozwiązanie idealne? Do czasu poważnego zbadania gdzie docierają użytkownicy. 1. łatwe okienko - dalej przechodziło 99% 2. b. trudne okienko - przechodziło 74% 3. trudne okienko - dalej przechodziło 61% 4. łatwe okienko - dalej przechodziło 59% 5. łatwe okienko - dalej przechodziło 57% http://khanwars.wp.pl/ 3
Po drugie: wygoda! A wygoda oznacza JavaScript http://vallheru.sourceforge.net/ Komiks na ten temat: http://909sickle.com/s/password-validation/ Po trzecie: raczej edukować niż zmuszać. Final battle A jeśli nie musimy dbać o to czy użytkownikom podoba się nasza `ergonomia haseł`? http://ars.userfriendly.org/cartoons/?id=20070929 4
Przechowywanie niezakodowane (plain text): hasło jest widoczne dla nas hasło jest widoczne dla naszych pracowników / współpracowników, którzy mają jakiś dostęp w razie jakiegokolwiek wycieku od razu dostępne są hasła narażamy się na ośmieszenie, jeżeli to wyjdzie jako użytkownik serwisu chciałbym wiedzieć, że koduje hasła Przechowywanie zakodowane: łatwe szybkie nie kosztuje i podobno jest dobre Więc właściwie czemu tego nie robić? Jak zakodować hasło? Metoda używana: MD5 - kryptograficzna funkcja skrótu qwe123 200820e3227815ed1756a6b531e7e0d2 Ma słabości Metoda zalecana: SHA-2 (256/224, 512/384) PHP, Perl,.NET, Python, Ruby Jak łamać MD5? Generujemy hashe dla wszelkich możliwych haseł i porównujemy. 11 mln hashy w 15s 57 mld w 20h Generujemy hashe dla wszelkich możliwych haseł i zapamiętujemy je. Potem już zawsze możemy w tym słowniku odszukać hash. 57 mld kombinacji to 890Gb Reverse MD5 - słowniki hashy MD5: Rozwiązanie: Tęczowe tablice http://google.pl/search?q=200820e3227815ed1756a6b531e7e0d2 http://md5.rednoize.com/ http://tools.benramsey.com/md5/ http://md5decryption.com/ - http://md5encryption.com/ http://tools.web-max.ca/encode_decode.php - md4, md5, sha1 http://md5.go.pl/ - pozwala szukać w 3 innych http://ilia.ws/archives/89-reverse-md5-search-aggregator.html Jednak skuteczność ograniczona do bazy 5
Zamiast całych list hashy przechowywane są pierwszy plaintext i ostatni hash z łańcucha: plaintext hash iaisudhiu 4259cc34599c530b1e4a8f225d665802 oxcvioix c744b1716cbf8d4dd0ff4ce31a177151 9da8dasf 3cd696a8571a843cda453a229d741843 [...] [...] sodifo8sf 7ad7d6fa6bb4fd28ab98b3dd33261e8f Algorytm wykonuje operacje wyłącznie na tym naszym hashu, który łamiemy, co wielokrotnie obniża złożoność obliczeniową. http://project-rainbowcrack.com Jak się bronić, czyli salt (ang. sól) #znak którego nie ma w tablicach $hash = md5( $passwd."\n" ); #stały salt $salt = "[w&3.b+ó`"; $hash = md5( $salt.$passwd ); #paranoja bywa dobra $hash = md5( $salt.md5($passwd) ); #zmienny salt $salt = microtime(); $hash = md5( $salt.md5($passwd) ); zapisz_salt(); #zmienny salt, który mamy już zapamiętany $j = md5( $line['joined'] ); $salt = "[".$j[3]."&".$j[27].".".$j[11]."+".$j[16]."`"; $hash = md5( $salt.md5($passwd) ); Bezpieczeństwo haseł w tworzeniu serwisów internetowych Dziękuję za uwagę Chyba nie było tak źle ;) Pytania? 6