ZASTRZEŻENIE : Ta odpowiedź została napisana w 2008 roku.
Od tego czasu PHP dał nam, password_hash
a password_verify
od ich wprowadzenia są zalecaną metodą mieszania i sprawdzania hasła.
Teoria odpowiedzi jest jednak nadal dobra.
TL; DR
Nie
- Nie ograniczaj znaków, które użytkownicy mogą wprowadzać dla haseł. Robią to tylko idioci.
- Nie ograniczaj długości hasła. Jeśli użytkownicy chcą zdania z superkalifragilisticexpialidocious, nie przeszkadzaj mu w jego użyciu.
- Nie usuwaj ani nie usuwaj znaków HTML i znaków specjalnych w haśle.
- Nigdy nie przechowuj hasła użytkownika w postaci zwykłego tekstu.
- Nigdy nie wysyłaj hasła do użytkownika, chyba że je utracił, a Ty wysłałeś hasło tymczasowe.
- Nigdy, nigdy nie loguj haseł w żaden sposób.
- Nigdy nie mieszaj haseł z SHA1, MD5, a nawet SHA256! Współczesne urządzenia do krakowania mogą przekraczać odpowiednio 60 i 180 miliardów skrótów / sekundę.
- Nie mieszaj bcrypta z surowym wyjściem hash () , albo używaj wyjścia hex lub base64_encode. (Dotyczy to wszelkich danych wejściowych, które mogą zawierać nieuczciwych
\0
, które mogą poważnie osłabić bezpieczeństwo).
Dos
- Użyj scrypt, kiedy możesz; bcrypt, jeśli nie możesz.
- Użyj PBKDF2, jeśli nie możesz używać ani bcrypt, ani scrypt, z skrótami SHA2.
- Zresetuj hasła wszystkich użytkowników, gdy baza danych zostanie naruszona.
- Zastosuj rozsądną minimalną długość 8–10 znaków, a także wymagaj co najmniej 1 dużej litery, 1 małej litery, cyfry i symbolu. Poprawi to entropię hasła, co z kolei utrudni jego złamanie. (Zobacz sekcję „Co stanowi dobre hasło?” W celu przeprowadzenia debaty).
Po co w ogóle hasła hash?
Cel mieszania haseł jest prosty: zapobieganie złośliwemu dostępowi do kont użytkowników poprzez naruszenie bazy danych. Tak więc celem mieszania haseł jest zniechęcenie hakera lub crackera, który kosztuje go zbyt wiele czasu lub pieniędzy, aby obliczyć hasła w postaci zwykłego tekstu. A czas / koszt to najlepsze środki odstraszające w twoim arsenale.
Innym powodem, dla którego chcesz mieć dobry, solidny hash na kontach użytkowników, jest dać ci wystarczająco dużo czasu na zmianę wszystkich haseł w systemie. Jeśli baza danych zostanie naruszona, będziesz potrzebować wystarczająco dużo czasu na przynajmniej zablokować system, jeśli nie, zmień każde hasło w bazie danych.
Jeremiah Grossman, dyrektor techniczny Whitehat Security, stwierdził na blogu White Hat Security po niedawnym odzyskaniu hasła, które wymagało brutalnego złamania jego ochrony hasłem:
Co ciekawe, żyjąc tym koszmarem, nauczyłem się DUŻO, że nie wiedziałem o łamaniu haseł, przechowywaniu i złożoności. Zrozumiałem, dlaczego przechowywanie haseł jest zawsze o wiele ważniejsze niż złożoność haseł. Jeśli nie wiesz, jak przechowywane jest twoje hasło, to wszystko, na czym naprawdę możesz polegać, to złożoność.To może być powszechna wiedza dla specjalistów od haseł i szyfrowania, ale dla przeciętnego eksperta InfoSec lub Web Security bardzo w to wątpię.
(Podkreśl moje.)
Co właściwie czyni dobre hasło?
Entropia . (Nie to, że w pełni popieram punkt widzenia Randalla.)
Krótko mówiąc, entropia określa, ile zmian zawiera hasło. Gdy hasło składa się tylko z małych liter rzymskich, to tylko 26 znaków. To nie jest duża różnorodność. Hasła alfanumeryczne są lepsze i mają 36 znaków. Jednak uwzględnienie wielkich i małych liter z symbolami to około 96 znaków. To o wiele lepsze niż tylko litery. Jednym z problemów jest to, że aby nasze hasła były niezapomniane, wstawiamy wzory - co zmniejsza entropię. Ups!
Entropia hasła jest przybliżona łatwo . Korzystanie z pełnego zakresu znaków ascii (około 96 znaków pisanych na maszynie) daje entropię 6,6 na znak, co przy 8 znakach dla hasła jest wciąż zbyt niskie (52,679 bitów entropii) dla przyszłego bezpieczeństwa. Ale dobrą wiadomością jest: dłuższe hasła i hasła ze znakami Unicode, naprawdę zwiększają entropię hasła i utrudniają złamanie.
Dłuższa dyskusja na temat entropii hasła na stronie Crypto StackExchange . Dobra wyszukiwarka Google również przyniesie wiele wyników.
W komentarzach rozmawiałem z @popnoodles, który zauważył, że egzekwowanie polityki haseł o długości X z X wieloma literami, cyframi, symbolami itp. Może faktycznie zmniejszyć entropię, czyniąc schemat haseł bardziej przewidywalnym. Zgadzam się. Losowość, tak prawdziwie losowa, jak to tylko możliwe, jest zawsze najbezpieczniejszym, ale najmniej pamiętnym rozwiązaniem.
O ile mogłem powiedzieć, tworzenie najlepszego hasła na świecie to Catch-22. Albo nie jest niezapomniany, zbyt przewidywalny, zbyt krótki, zbyt wiele znaków Unicode (trudne do wpisania na urządzeniu z systemem Windows / Mobile), zbyt długi itp. Żadne hasło nie jest wystarczająco dobre do naszych celów, więc musimy je chronić, tak jakby były w Fort Knox.
Najlepsze praktyki
Bcrypt i scrypt są obecne najlepsze praktyki. Scrypt będzie lepszy od bcrypt w czasie, ale nie widziałem przyjęcia go jako standardu przez Linux / Unix lub przez serwery WWW i nie opublikowano jeszcze szczegółowych recenzji jego algorytmu. Jednak przyszłość algorytmu wygląda obiecująco. Jeśli pracujesz z Ruby, istnieje klejnot scrypt , który ci pomoże, a Node.js ma teraz swój własny pakiet scrypt . Można użyć Scrypt w PHP albo poprzez Scrypt przedłużenia lub Libsodium rozszerzenia (oba są dostępne w PECL).
Gorąco polecam przeczytanie dokumentacji funkcji kryptograficznej, jeśli chcesz zrozumieć, jak korzystać z bcrypt, lub znaleźć dobre opakowanie lub użyć czegoś takiego jak PHPASS, aby uzyskać bardziej starszą implementację. Polecam minimum 12 rund bcrypt, jeśli nie 15 do 18.
Zmieniłem zdanie na temat korzystania z bcrypt, kiedy dowiedziałem się, że bcrypt używa tylko harmonogramu klucza blowfish, z mechanizmem zmiennego kosztu. To drugie pozwala zwiększyć koszt brutalnej siły hasła poprzez zwiększenie i tak drogiego kluczowego harmonogramu blowfish.
Średnie praktyki
Prawie nie wyobrażam sobie już takiej sytuacji. PHPASS obsługuje PHP 3.0.18 do 5.3, więc można go używać w prawie każdej możliwej instalacji - i powinien być używany, jeśli nie wiesz na pewno, że twoje środowisko obsługuje bcrypt.
Załóżmy jednak, że nie można w ogóle używać bcrypt ani PHPASS. Co wtedy?
Wypróbuj implementację PDKBF2 z maksymalną liczbą rund, którą twoje środowisko / aplikacja / postrzeganie użytkownika może tolerować. Najniższa zalecana przeze mnie liczba to 2500 rund. Upewnij się również, że używasz hash_hmac (), jeśli jest on dostępny, aby utrudnić odtwarzanie operacji.
Przyszłe praktyki
W PHP 5.5 znajduje się pełna biblioteka do ochrony hasłem, która odciąga wszelkie problemy związane z pracą z bcrypt. Podczas gdy większość z nas utknęła w PHP 5.2 i 5.3 w większości popularnych środowisk, zwłaszcza hostów współdzielonych, @ircmaxell zbudował warstwę kompatybilności dla nadchodzącego API, która jest wstecznie kompatybilna z PHP 5.3.7.
Podsumowanie kryptografii i wyłączenie odpowiedzialności
Moc obliczeniowa wymagana do złamania zaszyfrowanego hasła nie istnieje. Jedynym sposobem na „złamanie” hasła przez komputer jest jego ponowne utworzenie i symulacja algorytmu mieszającego używanego do jego zabezpieczenia. Szybkość skrótu jest liniowo związana z jego zdolnością do brutalnej siły. Co gorsza, większość algorytmów mieszających można łatwo zrównoleglić, aby działać jeszcze szybciej. Dlatego tak ważne są kosztowne programy, takie jak bcrypt i scrypt.
Nie możesz przewidzieć wszystkich zagrożeń ani dróg ataku, dlatego musisz dołożyć wszelkich starań, aby chronić użytkowników z góry . Jeśli tego nie zrobisz, możesz nawet przegapić fakt, że zostałeś zaatakowany, dopóki nie będzie za późno ... i jesteś odpowiedzialny . Aby uniknąć tej sytuacji, na początku działaj paranoikiem. Atakuj własne oprogramowanie (wewnętrznie) i próbuj kraść poświadczenia użytkownika lub modyfikować konta innych użytkowników lub uzyskiwać dostęp do ich danych. Jeśli nie przetestujesz bezpieczeństwa swojego systemu, nie możesz obwiniać nikogo oprócz siebie.
Wreszcie: nie jestem kryptografem. Cokolwiek powiedziałem, to moja opinia, ale wydaje mi się, że opiera się na dobrym rozsądku ... i dużej ilości lektury. Pamiętaj, bądź tak paranoikiem, jak to tylko możliwe, staraj się jak najtrudniej przeszkadzać, a następnie, jeśli nadal się martwisz, skontaktuj się z białym hakerem lub kryptografem, aby zobaczyć, co mówią o twoim kodzie / systemie.