Szukam najlepszej metody na zaimplementowanie funkcji „zapomniałem hasła”.
Wychodzę z 2 pomysłami:
Gdy użytkownik kliknie zapomniane hasło, musi wprowadzić nazwę użytkownika, adres e-mail i być może datę urodzenia lub nazwisko. Następnie na konto e-mail użytkownika zostanie wysłana wiadomość z tymczasowym hasłem. Użytkownik używa tymczasowego hasła do logowania i resetuje swoje hasło.
Podobnie, ale wiadomość e-mail zawierałaby łącze umożliwiające użytkownikowi zresetowanie hasła.
Czy ktoś może zasugerować mi lepszy i bezpieczny sposób? Zastanawiam się również nad wysłaniem tymczasowego hasła lub linku, zmuszenia użytkownika do zresetowania hasła w ciągu 24 godzin, w przeciwnym razie tymczasowe hasło lub łącze nie będą użyteczne. Jak to zrobić?
Odpowiedzi:
Aktualizacja: poprawiona w maju 2013 dla lepszego podejścia
password_change_requests
z kolumnamiID
,Time
aUserID
. Gdy nowy użytkownik naciśnie przycisk, w tabeli zostanie utworzony rekord.Time
Kolumna zawiera czas, gdy użytkownik nacisnął przycisk „Zapomniałem hasła”. ToID
jest ciąg. Tworzony jest długi, losowy ciąg (powiedzmy, identyfikator GUID), a następnie haszowany jak hasło (co samo w sobie jest osobnym tematem). Ten skrót jest następnie używany jako „identyfikator” w tabeli.http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF
. Strona forgotpassword.jsp powinna móc pobrać parametr ID. Przepraszam, nie znam Javy, więc nie mogę być bardziej szczegółowy.ID
adres URL, szyfruje go ponownie i sprawdza w tabeli. Jeśli taki zapis istnieje i nie ma więcej niż, powiedzmy, 24 godzin, pojawia się monit o wprowadzenie nowego hasła .źródło
ID
,UserID
,Time
,TokenHash
.. Ty wygeneruje dwa długie ciągi Umieść pierwszy ciąg ( „ID”) wID
kolumnie; hash drugi (dalej „żeton” ) i umieść hash wTokenHash
kolumnie.forogotPassword.jsp?id=asdasd&token=asdasd
Wszystko zależy od Twojej witryny i poziomu bezpieczeństwa, który próbujesz osiągnąć, ale podstawowy proces dla aplikacji internetowej wygląda mniej więcej tak:
Użytkownik przechodzi do strony „zapomniałem hasła” i wprowadza swoją nazwę użytkownika lub adres e-mail (w zależności od tego, który jest unikalny), aby poprosić o zresetowanie hasła.
Opcjonalnie na tym etapie możesz potwierdzić żądanie, prosząc o dodatkowe informacje, takie jak odpowiedź na predefiniowane pytanie bezpieczeństwa lub ich datę urodzenia itp. Ten dodatkowy poziom uniemożliwia użytkownikom otrzymywanie wiadomości e-mail, o które nie prosili.
Wyszukaj konto użytkownika. Zapisz tymczasowe hasło (zwykle identyfikator GUID) i sygnaturę czasową w rekordzie konta. Wyślij wiadomość e-mail do użytkownika zawierającą tymczasowe hasło.
Użytkownik albo klika łącze zawierające tymczasowe hasło i identyfikator użytkownika w wiadomości e-mail, albo przechodzi do strony „zapomniałem hasła” i kopiuje i wkleja tymczasowe hasło oraz jego identyfikator. Użytkownik wprowadza nowe hasło i potwierdza je.
Wyszukaj rekord użytkownika i jeśli aktualny czas mieści się w określonym limicie czasu (np. 1 godzina) znacznika czasu zapisanego w kroku 2, zaszyfruj i zapisz nowe hasło. (Oczywiście tylko wtedy, gdy hasła tymczasowe są zgodne!). Usuń tymczasowy identyfikator GUID i znacznik czasu.
Główną zasadą jest to, że użytkownik otrzymuje e-mailem tymczasowe hasło, które pozwala mu zmienić hasło. Oryginalnie zapisane hasło (powinno być zaszyfrowane!) Nigdy nie jest zmieniane na hasło tymczasowe na wypadek, gdyby użytkownik je zapamiętał.
Oryginalne hasło nigdy nie będzie wyświetlane użytkownikowi, ponieważ powinno być zaszyfrowane i nieznane.
Zwróć uwagę, że ten proces całkowicie zależy od bezpieczeństwa konta e-mail użytkownika. Zależy to więc od poziomu bezpieczeństwa, jaki chcesz osiągnąć. Zwykle wystarcza to w przypadku większości witryn / aplikacji.
źródło
Troy Hunt przedstawia kilka doskonałych uwag w swoim artykule: Wszystko , co chciałeś wiedzieć o tworzeniu funkcji bezpiecznego resetowania hasła . Najważniejsze fragmenty to:
...
...
...
...
Podaje o wiele więcej dobrych punktów dotyczących unikania wycieków informacji, CAPTCHA, uwierzytelniania dwuskładnikowego i oczywiście podstawowych najlepszych praktyk, takich jak haszowanie haseł. Myślę, że ważne jest, aby zauważyć, że nie zgadzam się z Troyem co do użyteczności pytań bezpieczeństwa, preferując sceptycyzm Bruce'a Schneiera w tej praktyce :
źródło
Pójdę z:
źródło
Kiedy wysyłasz jakiekolwiek informacje pocztą elektroniczną, nie będzie to bezpieczne. Jest zbyt wiele sposobów, by ktoś mógł to zdobyć. To byłoby dziecinnie proste dla wykwalifikowanego hakera, który chce ukraść Twoje informacje.
Powstrzymaj się od wysyłania jakichkolwiek danych osobowych, takich jak hasła i informacje o dochodach, pocztą elektroniczną, ponieważ może to stać się BARDZO PRZYSŁUGUJĄCE Tobie i Twojej organizacji, jeśli takie informacje zostały ujawnione lub skradzione. Pomyśl poważnie o bezpieczeństwie. Wystarczy ten jeden incydent, by upadły wszystkie cegły.
Jeśli chodzi o odzyskiwanie hasła, przeczytaj uważnie Sprawdzone metody dotyczące zapomnienia hasła .
EDYCJA: zaktualizowany link
źródło
Jak powiedziałem, zależy to od wymaganego poziomu bezpieczeństwa, jednak jeśli potrzebujesz wyższego poziomu, niektóre nowatorskie rozwiązania, które widziałem, obejmują;
Wyświetlanie połowy hasła tymczasowego po potwierdzeniu tożsamości użytkownika (pytanie bezpieczeństwa, adres e-mail itp.), A następnie przesłanie drugiej połowy na konto e-mail. Jeśli konto e-mail zostało przejęte, jest mało prawdopodobne, aby ta sama osoba również zdołała przeprowadzić atak typu man-in-the-middle. (Widziane na brytyjskiej bramie rządowej)
Potwierdzenie tożsamości za pośrednictwem poczty elektronicznej i innego medium - na przykład kod wysłany SMS-em na zarejestrowany telefon komórkowy. (Widziane w serwisie eBay / PayPal)
Gdzieś pomiędzy tymi dwoma skrajnościami może być implementacja pytań bezpieczeństwa, jak wspomniał DaveG.
źródło
Jeśli przy rejestracji podasz adres e-mail. Przycisk „zapomnij hasło” powoduje wysłanie wiadomości e-mail na ten adres e-mail. Zapewnia, że informacje są wysyłane na zaufany adres e-mail.
(Chyba że baza danych została zhakowana, ale wtedy nic nie jest bezpieczne).
źródło
Oto trzy bardzo dobre linki, które dostarczają informacji o resetowaniu haseł:
http://jtauber.com/blog/2006/03/20/account_management_patterns/
(Nie pozwól użytkownikom potwierdzać za pomocą GET): http://www.artima.com/forums/flat.jsp?forum=106&thread=152805&start=15&msRange=15
http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf
Mam nadzieję, że to pomoże. Z pewnością pomogli mi zrozumieć problem.
źródło
Wymuszałbym unikalne adresy e-mail na wszystkich kontach.
Wtedy wystarczy po prostu wysłać link do tymczasowej strony, na której osoba może zmienić hasło. (odczekaj 24 godziny lub mniej)
Konto e-mail użytkownika jest najsłabszym łączem w tym scenariuszu.
źródło
Nigdy nie wysyłaj hasła e-mailem do użytkownika. Nawet jeśli jest generowany automatycznie. Najlepsze podejście (zalecane i używane przez SANS i inne):
Jeśli nie kliknie linku w ciągu 24 godzin, wyłącz łącze (aby nie zmieniało już hasła).
Nigdy nie zmieniaj hasła bez zgody użytkownika. Oznacza to, że nie wysyłaj nowego hasła e-mailem tylko dlatego, że ktoś kliknął link do zapomnianego hasła i zorientował się, jaka jest nazwa konta.
źródło