Najlepszy sposób na wdrożenie „zapomniałem hasła”? [Zamknięte]

153

Szukam najlepszej metody na zaimplementowanie funkcji „zapomniałem hasła”.

Wychodzę z 2 pomysłami:

  1. 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.

  2. 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ć?

Zaki
źródło
Ponownie otagowałem post, ponieważ wykracza to poza JSF - w ten sposób prawdopodobnie otrzymasz więcej odpowiedzi.
McDowell,
6
@Whoever W ostatnich miesiącach na meta pojawiła się fala „usuńmy to zamknięte pytanie, ponieważ XYZ”. Chciałbym tylko zaznaczyć, że tego konkretnego pytania nie należy usuwać, chyba że zostanie udowodnione, że rozwiązania są wadliwe i że jego istnienie bardziej szkodzi niż pomaga w kwestii bezpieczeństwa.
Félix Gagnon-Grenier
1
OWASP "ściągawka" dla strategii odzyskiwania zapomnianego hasła: owasp.org/index.php/ ...
daiscog
Łącze sugeruje @megaflop jest teraz niestety uszkodzony, tutaj jest nowy związek: cheatsheetseries.owasp.org/cheatsheets/...
Marco Bolis

Odpowiedzi:

186

Aktualizacja: poprawiona w maju 2013 dla lepszego podejścia

  1. Użytkownik wpisuje swoją nazwę użytkownika i uderza w „zapomniałem hasła”. Polecam również opcję wpisania adresu e-mail zamiast nazwy użytkownika, ponieważ czasami zapomina się również o nazwach użytkowników.
  2. System posiada tabelę password_change_requestsz kolumnami ID, Timea UserID. Gdy nowy użytkownik naciśnie przycisk, w tabeli zostanie utworzony rekord. TimeKolumna zawiera czas, gdy użytkownik nacisnął przycisk „Zapomniałem hasła”. To IDjest 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.
  3. System wysyła wiadomość e-mail do użytkownika, która zawiera łącze. Łącze zawiera również oryginalny ciąg identyfikacyjny (przed haszowaniem). Łącze będzie coś takiego: 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.
  4. Gdy użytkownik kliknie łącze w wiadomości e-mail, zostanie przeniesiony na Twoją stronę. Strona pobiera IDadres 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 .
  5. Użytkownik wprowadza nowe hasło, naciska OK i wszyscy żyją długo i szczęśliwie ... do następnego razu!
Vilx-
źródło
1
najwłaściwszym sposobem wdrożenia tego byłoby - wysłanie tymczasowego tokena resetowania hasła jako e-maila w postaci zwykłego tekstu do użytkownika (ale nigdy nie przechowuj go jako zwykłego tekstu w bazie danych) - po wejściu użytkownika w ten tymczasowy plik natychmiast zmusić go do wprowadź ponownie nowe hasło. - dla paranoików, upewnij się, że twój serwer smtp ma ssl, aby twoje wiadomości zawierające poufne informacje nie zostały podsłuchane. w większości przypadków takie podejście jest dość bezpieczne. jeśli Twoja sprawa wymaga większego bezpieczeństwa, prawdopodobnie nie powinieneś mieć użytkowników, którzy zapomnieli swoich haseł: S
Kaushik Gopal
6
Po co generować losowy ciąg znaków / identyfikator guid, haszować go i używać skrótu? Czy przewodnik nie wystarczy?
Jeroen K,
15
@jeroenk - jeśli ktoś ukradnie twoją bazę danych, nie może sfałszować linku „Resetuj hasło” i zmienić czyjegoś hasła.
Vilx
4
jest to zasadniczo opisany sposób prawidłowego resetowania hasła crackstation.net/hashing-security.htm#faq
TruthOf42
1
@David - Ach, chciałem edytować post, ale temat jest zablokowany. :( OK, spróbujmy jeszcze raz: tabela zawiera kolumny: ID, UserID, Time, TokenHash.. Ty wygeneruje dwa długie ciągi Umieść pierwszy ciąg ( „ID”) w IDkolumnie; hash drugi (dalej „żeton” ) i umieść hash w TokenHashkolumnie. forogotPassword.jsp?id=asdasd&token=asdasd
Wygeneruj
28

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

David Glenn
źródło
24

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:

[T] oto dwa popularne podejścia:

  1. Wygeneruj nowe hasło na serwerze i wyślij je e-mailem
  2. Wyślij e-mail z unikalnym adresem URL, który ułatwi proces resetowania

Pomimo wielu przeciwnych wskazówek, pierwszy punkt tak naprawdę nie jest tym, gdzie chcemy być. Problem polega na tym, że oznacza to, że trwałe hasło - takie, którego możesz użyć w dowolnym momencie - zostało wysłane przez niezabezpieczony kanał i znajduje się w Twojej skrzynce odbiorczej.

...

Ale jest jeszcze jeden duży problem z pierwszym podejściem, ponieważ sprawia, że ​​złośliwa blokada konta jest banalnie prosta. Jeśli znam adres e-mail osoby, która jest właścicielem konta w witrynie internetowej, mogę zablokować jej dostęp w dowolnym momencie, po prostu resetując hasło; to atak typu „odmowa usługi” podany na srebrnym talerzu! Dlatego reset jest czymś, co powinno nastąpić dopiero po pomyślnym zweryfikowaniu prawa żądającego do tego.

Kiedy mówimy o resetowanym adresie URL, mówimy o adresie strony internetowej, który jest unikalny dla tego konkretnego wystąpienia procesu resetowania.

...

Chcemy stworzyć unikalny token, który można wysłać w wiadomości e-mail jako część adresu URL resetowania, a następnie dopasować z powrotem do rekordu na serwerze obok konta użytkownika, potwierdzając w ten sposób, że właściciel konta e-mail jest rzeczywiście tym, który próbuje zresetować hasło. Na przykład token może mieć postać „3ce7854015cd38c862cb9e14a1ae552b” i jest przechowywany w tabeli obok identyfikatora użytkownika przeprowadzającego reset i czasu, w którym token został wygenerowany (więcej o tym za chwilę). Wysyłana wiadomość e-mail zawiera adres URL, na przykład „Reset /? Id = 3ce7854015cd38c862cb9e14a1ae552b”, a gdy użytkownik go wczyta, strona sprawdza istnienie tokena, a następnie potwierdza tożsamość użytkownika i zezwala na hasło zmienić się.

...

Inną rzeczą, którą chcemy zrobić z adresem URL resetowania, jest ograniczenie czasu tokena, tak aby proces resetowania musiał zostać zakończony w określonym czasie, powiedzmy w ciągu godziny.

...

Wreszcie, chcemy mieć pewność, że jest to jednorazowy proces. Po zakończeniu procesu resetowania token należy usunąć, aby adres URL resetowania nie działał. Podobnie jak w poprzednim punkcie, ma to na celu zapewnienie atakującemu bardzo ograniczonego okna, w którym może nadużywać adresu URL resetowania. Oczywiście token nie jest już wymagany, jeśli proces resetowania zakończył się pomyślnie.

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 :

Cel wszystkich tych pytań jest taki sam: hasło zapasowe. Jeśli zapomnisz hasła, tajne pytanie może zweryfikować twoją tożsamość, dzięki czemu będziesz mógł wybrać inne hasło lub poprosić witrynę o przesłanie Ci aktualnego hasła e-mailem. To świetny pomysł z punktu widzenia obsługi klienta - jest mniej prawdopodobne, że użytkownik zapomni imienia swojego pierwszego zwierzaka niż jakieś przypadkowe hasło - ale straszne dla bezpieczeństwa. Odpowiedź na tajne pytanie jest znacznie łatwiejsza do odgadnięcia niż dobre hasło, a informacje są znacznie bardziej publiczne.

Dave Liepmann
źródło
1
Ten link ma wyraźne obrazy NSFW, jest link, który to zmienia, ale wiele osób najpierw skanuje stronę. Głupi pomysł!
nik0lai
Link do artykułu Troy Hunt uległ zmianie. Idź do troyhunt.com/everything-you-ever-wanted-to-know
knarfancho
@knarfancho Naprawiono, dzięki!
Dave Liepmann,
15

Pójdę z:

  1. Zapytaj użytkownika o e-mail, sprawdź, czy e-mail jest zarejestrowany
  2. Wygeneruj identyfikator GUID i wyślij go na ten adres e-mail
  3. Nie resetuj jeszcze hasła
  4. Użytkownik klika link, a następnie musi wprowadzić nową przepustkę
  5. Resetuj hasło tylko wtedy, gdy użytkownik jest w Twojej witrynie i kliknął przycisk resetowania po wpisaniu nowego hasła.
  6. Spraw, aby ten identyfikator GUID był pożądany w krótkim czasie, aby był bezpieczniejszy.
andres.santana
źródło
Nie chcę mieć kłopotów z pytaniem? ale jest to związane z twoją odpowiedzią. Jak generujesz identyfikator GUID?
KingAndrew
2
-1 za
nieimplementowanie
11

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 .

Najważniejsze jest to, że aplikacja działająca zgodnie z najlepszymi praktykami powinna umożliwiać użytkownikowi resetowanie własnego hasła. Należy używać osobistych pytań zabezpieczających. Aplikacja nie powinna wysyłać e-maili, wyświetlać haseł ani ustawiać haseł tymczasowych.

EDYCJA: zaktualizowany link

jinsungy
źródło
Wypróbowałem łącze do sprawdzonych metod dotyczących zapomnienia hasła i otrzymałem błąd serwera 500. Czy uważasz, że serwer jest teraz wyłączony, czy jest inny link do śledzenia?
KingAndrew
łącze jest znowu martwe.
Eric Cope
7

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.

Tom Werner
źródło
6

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).

Toon Krijthe
źródło
4

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.

Andrew Harry
źródło
2

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):

  1. Na stronie zapomnianego hasła poproś użytkownika o podanie adresu e-mail / identyfikatora użytkownika i NOWE hasło.
  2. Wyślij łącze do zapisanej wiadomości e-mail dla tego konta z łączem aktywacyjnym.
  3. Gdy użytkownik kliknie to łącze, włącz nowe hasło.

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.

Sucuri
źródło
13
Jestem zainteresowany tą techniką. Atakujący wprowadza Twój adres e-mail i NOWE hasło. Właściciel konta otrzymuje wiadomość e-mail, coś źle odczytuje i klika link. Osoba atakująca, która co minutę próbuje nowego hasła, uzyskuje dostęp do konta, dopóki właściciel konta nie zorientuje się, co się stało, i ostatecznie przejdzie do strony „zapomniałem hasła”.
Odi - Xceed
Inny problem! podanie nowego hasła na czas resetowania hasła nie jest dobrym rozwiązaniem. Mogę ponownie zapomnieć nowe hasło, jeśli po godzinach sprawdzę pocztę!
Yazid Erman