Najlepiej jest nie wymyślać koła na nowo. Rozumiem jednak, że w świecie PHP znalezienie komponentu wysokiej jakości, który już to robi, może być trudne (nawet jestem prawie pewien, że frameworki implementują takie rzeczy, a ich implementacje są już przetestowane, solidne, poddane przeglądowi kodu itp. )
Jeśli możesz, użyj PBKDF2 lub Bcrypt . To jest zrobione dla tego.
Uzasadnienie: oba algorytmy mogą spowolnić proces haszowania, co jest dokładnie tym, czego chcesz, gdy hashujesz hasła (szybsze alternatywy oznaczają łatwiejszą brutalną siłę). Najlepiej jest dostosować parametry, aby proces stał się wolniejszy z czasem na tym samym sprzęcie, a nowy, szybszy sprzęt został wydany.
Jeśli nie możesz, przynajmniej nie używaj MD5 / SHA1. Nigdy. Zapomnij o tym . Na przykład użyj SHA512. Użyj też soli.
Uzasadnienie: MD5 i SHA1 są zbyt szybkie. Jeśli atakujący ma dostęp do bazy danych zawierającej skróty i ma (nawet nie szczególnie) potężną maszynę, brutalne wymuszanie hasła jest szybkie i łatwe. Jeśli nie ma soli, zwiększa się szansa, że atakujący znajdzie rzeczywiste hasło (co może spowodować dodatkowe szkody, jeśli hasło zostanie ponownie użyte w innym miejscu).
W PHP 5.5.0 i nowszych wersjach użyj password_hash
i password_verify
.
Uzasadnienie: wywołanie funkcji zapewnianej przez framework jest łatwe, więc ryzyko popełnienia błędu jest zmniejszone. Dzięki tym dwóm funkcjom nie musisz myśleć o różnych parametrach, takich jak skrót. Pierwsza funkcja zwraca pojedynczy ciąg, który można następnie zapisać w bazie danych. Druga funkcja używa tego ciągu do weryfikacji hasła.
Chroń się przed brutalną siłą . Jeśli użytkownik poda nieprawidłowe hasło, gdy już podało inne nieprawidłowe hasło 0,01 sekundy temu, to dobry powód, aby je zablokować. Chociaż ludzie potrafią pisać szybko, prawdopodobnie nie mogą być tak szybcy.
Inną ochroną byłoby ustawienie limitu awarii na godzinę. Jeśli użytkownik przesłał 3600 błędnych haseł w ciągu godziny, 1 hasło na sekundę, trudno uwierzyć, że jest to legalny użytkownik.
Uzasadnienie: jeśli twoje hasła są zakodowane w niepewny sposób, brutalna siła może być bardzo skuteczna. Jeśli hasła są przechowywane bezpiecznie, brutalna siła wciąż marnuje zasoby serwera i przepustowość sieci, powodując niższą wydajność dla legalnych użytkowników. Wykrywanie brutalnej siły nie jest łatwe do opracowania i poprawnego działania, ale dla każdego innego niż niewielki system jest tego całkowicie warte.
Nie proś użytkowników o zmianę hasła co cztery tygodnie. Jest to bardzo denerwujące i zmniejsza bezpieczeństwo, ponieważ zachęca do bezpieczeństwa po zakończeniu.
Uzasadnienie: pomysł, że wymuszanie zmiany haseł co n tygodni chroni system przed brutalną siłą, jest błędny. Ataki typu „brute force” zwykle kończą się powodzeniem w ciągu kilku sekund, minut, godzin lub dni, co sprawia, że comiesięczne zmiany hasła są nieistotne. Z drugiej strony użytkownicy źle pamiętają hasła. Co więcej, jeśli będą musieli je zmienić, albo spróbują użyć bardzo prostych haseł, albo po prostu zanotują swoje hasła na post-it.
Kontroluj wszystko za każdym razem. Przechowuj dane logowania, ale nigdy nie przechowuj haseł w dzienniku kontroli. Upewnij się, że dziennik kontroli nie może zostać zmodyfikowany (tzn. Możesz dodać dane na końcu, ale nie modyfikować istniejących danych). Upewnij się, że dzienniki kontroli podlegają regularnej kopii zapasowej. Idealnie byłoby, gdyby logi były przechowywane na dedykowanym serwerze z bardzo ograniczonymi dostępami: jeśli zhakowany zostanie inny serwer, atakujący nie będzie w stanie wyczyścić logów, aby ukryć swoją obecność (i ścieżkę podjętą podczas ataku).
Nie zapamiętaj danych użytkownika w plikach cookie, chyba że użytkownik poprosi o to (pole „Pamiętaj mnie” musi być domyślnie odznaczone, aby uniknąć błędu ludzkiego).