it-swarm.com.de

Der beste Weg für eine Implementierung mit "Passwort vergessen"?

Ich suche nach der besten Methode, um die Funktion "Passwort vergessen" zu implementieren.

Ich komme mit 2 Ideen heraus:

  1. Wenn der Benutzer auf Passwort vergessen klickt, muss er den Benutzernamen, die E-Mail-Adresse und möglicherweise das Geburtsdatum oder den Nachnamen eingeben. Anschließend wird eine E-Mail mit einem temporären Passwort an das E-Mail-Konto des Benutzers gesendet. Der Benutzer verwendet das temporäre Kennwort zum Anmelden und setzt sein Kennwort zurück.

  2. Ähnlich, aber die E-Mail würde einen Link enthalten, über den der Benutzer sein Passwort zurücksetzen kann.

Oder kann mir jemand einen besseren und sicheren Weg vorschlagen? Ich denke auch daran, das temporäre Passwort oder den temporären Link zu senden, den Benutzer zu zwingen, das Passwort innerhalb von 24 Stunden zurückzusetzen, oder das temporäre Passwort oder der temporäre Link kann nicht verwendet werden. Wie geht das?

143
Hoe Chin

Update: überarbeitet im Mai 2013 für einen besseren Ansatz

  1. Der Benutzer gibt seinen Benutzernamen ein und klickt auf "Passwort vergessen". Ich empfehle auch die Eingabe der E-Mail-Adresse anstelle des Benutzernamens, da Benutzernamen manchmal auch vergessen werden.
  2. Das System hat eine Tabelle password_change_requests mit den Spalten ID, Time und UserID. Wenn der neue Benutzer die Schaltfläche drückt, wird ein Datensatz in der Tabelle erstellt. Die Spalte Time enthält die Zeit, zu der der Benutzer auf die Schaltfläche "Passwort vergessen" geklickt hat. Das ID ist eine Zeichenfolge. Eine lange zufällige Zeichenfolge wird erstellt (z. B. eine GUID) und dann wie ein Kennwort gehasht (dies ist ein eigenständiges Thema). Dieser Hash wird dann als 'ID' in der Tabelle verwendet.
  3. Das System sendet eine E-Mail an den Benutzer, die einen Link enthält. Der Link enthält auch die ursprüngliche ID-Zeichenfolge (vor dem Hashing). Der Link wird ungefähr so ​​aussehen: http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF. Die Seite forgotpassword.jsp sollte den ID-Parameter abrufen können. Entschuldigung, ich kenne Java nicht, also kann ich nicht genauer sein.
  4. Wenn der Benutzer auf den Link in der E-Mail klickt, wird er auf Ihre Seite verschoben. Die Seite ruft das ID von der URL ab, hackt es erneut und vergleicht es mit der Tabelle. Wenn ein solcher Datensatz vorhanden ist und nicht älter als 24 Stunden ist, wird dem Benutzer die Aufforderung zur Eingabe eines neuen Kennworts angezeigt.
  5. Der Benutzer gibt ein neues Passwort ein, drückt OK und alle leben glücklich bis zum nächsten Mal!
174
Vilx-

Es hängt alles von Ihrer Website und der Sicherheitsstufe ab, die Sie erreichen möchten. Der grundlegende Prozess für eine Web-App sieht jedoch wie folgt aus:

  1. Der Benutzer navigiert zur Seite "Passwort vergessen" und gibt seinen Benutzernamen oder seine E-Mail-Adresse (je nachdem, welche eindeutig ist) ein, um ein Zurücksetzen des Passworts anzufordern.

  2. Optional können Sie zu diesem Zeitpunkt die Anforderung bestätigen, indem Sie zusätzliche Informationen anfordern, z. B. die Antwort auf eine vordefinierte Sicherheitsfrage oder das Geburtsdatum. Diese zusätzliche Stufe verhindert, dass Benutzer E-Mails erhalten, die sie nicht angefordert haben.

  3. Schlagen Sie das Benutzerkonto nach. Speichern Sie ein temporäres Kennwort (normalerweise eine GUID) und einen Zeitstempel für den Kontodatensatz. Senden Sie eine E-Mail an den Benutzer, der das temporäre Kennwort enthält.

  4. Der Benutzer klickt entweder in der E-Mail auf den Link, der das temporäre Passwort und die Benutzerkennung enthält, oder navigiert zur Seite "Passwort vergessen" und kopiert und fügt das temporäre Passwort und die Benutzerkennung ein. Der Benutzer gibt sein neues Passwort ein und bestätigt es.

  5. Überprüfen Sie den Benutzerdatensatz und speichern Sie das neue Kennwort, wenn die aktuelle Zeit innerhalb eines festgelegten Zeitlimits (z. B. 1 Stunde) des in Schritt 2 gespeicherten Zeitstempels liegt. (Natürlich nur, wenn die temporären Passwörter übereinstimmen!). Löschen Sie das temporäre GUID und den Zeitstempel.

Das Prinzip hierbei ist, dass dem Benutzer ein temporäres Passwort per E-Mail gesendet wird, mit dem er sein Passwort ändern kann . Das ursprünglich gespeicherte Passwort (es sollte gehasht werden!) Wird niemals in ein temporäres Passwort geändert, falls sich der Benutzer daran erinnert.

Das ursprüngliche Passwort wird dem Benutzer niemals angezeigt, da es gehasht und unbekannt sein sollte.

Hinweis Dieser Vorgang hängt vollständig von der Sicherheit des E-Mail-Kontos des Benutzers ab. Es kommt also auf das Sicherheitsniveau an, das Sie erreichen möchten. Dies ist normalerweise für die meisten Websites/Apps ausreichend.

27
David Glenn

Troy Hunt bringt in seinem Artikel einige hervorragende Punkte zum Ausdruck: Alles, was Sie schon immer über das Erstellen einer sicheren Funktion zum Zurücksetzen von Passwörtern wissen wollten . Die wichtigsten Auszüge sind:

[T] hier sind zwei gängige Ansätze:

  1. Erstellen Sie ein neues Passwort auf dem Server und senden Sie es per E-Mail
  2. Senden Sie eine eindeutige URL per E-Mail, die einen Rücksetzvorgang erleichtert

Trotz vieler gegenteiliger Anweisungen ist der erste Punkt wirklich nicht der Punkt, an dem wir sein wollen. Das Problem dabei ist, dass ein dauerhaftes Kennwort - ein Kennwort, das Sie jederzeit verwenden können - jetzt über einen unsicheren Kanal gesendet wurde und sich in Ihrem Posteingang befindet.

...

Ein weiteres großes Problem besteht darin, dass die böswillige Sperrung eines Kontos so einfach ist. Wenn ich die E-Mail-Adresse einer Person kenne, die ein Konto auf einer Website besitzt, kann ich sie jederzeit sperren, indem ich ihr Passwort zurücksetze. Es ist ein Denial-of-Service-Angriff, der auf einem Silbertablett serviert wird. Dies ist der Grund, warum ein Zurücksetzen nur dann erfolgen sollte, wenn das Recht des Anforderers, dies zu tun, erfolgreich überprüft wurde.

Wenn es sich um eine Rücksetz-URL handelt, handelt es sich um eine Website-Adresse, die für diese bestimmte Instanz des Rücksetzvorgangs eindeutig ist.

...

Wir möchten ein eindeutiges Token erstellen, das in einer E-Mail als Teil der Rücksetz-URL gesendet und dann zusammen mit dem Benutzerkonto mit einem Datensatz auf dem Server abgeglichen werden kann. Auf diese Weise wird bestätigt, dass der E-Mail-Kontoinhaber tatsächlich versucht, das zurückzusetzen Passwort. Das Token kann beispielsweise "3ce7854015cd38c862cb9e14a1ae552b" lauten und wird in einer Tabelle zusammen mit der ID des Benutzers, der das Zurücksetzen durchgeführt hat, und dem Zeitpunkt, zu dem das Token generiert wurde, gespeichert (mehr dazu in einem Moment). Wenn die E-Mail versendet wird, enthält sie eine URL wie z. B. "Reset /? Id = 3ce7854015cd38c862cb9e14a1ae552b". Wenn der Benutzer diese lädt, überprüft die Seite das Vorhandensein des Tokens und bestätigt anschließend die Identität des Benutzers und lässt das Kennwort zu verändert sein.

...

Das andere, was wir mit einer Reset-URL tun möchten, ist, das Token zeitlich so zu begrenzen, dass der Reset-Vorgang innerhalb einer bestimmten Zeitspanne, beispielsweise innerhalb einer Stunde, abgeschlossen sein muss.

...

Schließlich möchten wir sicherstellen, dass dies ein einmaliger Vorgang ist. Nach Abschluss des Rücksetzvorgangs sollte das Token gelöscht werden, damit die Rücksetz-URL nicht mehr funktioniert. Wie im vorherigen Punkt soll damit sichergestellt werden, dass ein Angreifer über ein sehr begrenztes Fenster verfügt, in dem er die zurückgesetzte URL missbrauchen kann. Außerdem wird der Token nicht mehr benötigt, wenn der Rücksetzvorgang erfolgreich abgeschlossen wurde.

Er macht noch viel mehr gute Argumente zur Vermeidung von Informationslecks, CAPTCHAs, Zwei-Faktor-Authentifizierung und natürlich den grundlegenden Best Practices wie Passwort-Hashing. Ich denke, es ist wichtig anzumerken, dass ich mit Troy in Bezug auf die Nützlichkeit von Sicherheitsfragen nicht einverstanden bin. Ich bevorzuge Bruce Schneiers Skepsis gegenüber der Praxis :

Der Sinn all dieser Fragen ist der gleiche: ein Backup-Passwort. Wenn Sie Ihr Passwort vergessen, kann die geheime Frage Ihre Identität bestätigen, sodass Sie ein anderes Passwort auswählen oder sich von der Site Ihr aktuelles Passwort per E-Mail zusenden lassen können. Aus Sicht des Kundendienstes ist dies eine großartige Idee - ein Benutzer vergisst wahrscheinlich weniger den Namen seines ersten Haustieres als ein zufälliges Passwort - aber aus Sicherheitsgründen schrecklich. Die Antwort auf die geheime Frage ist viel einfacher zu erraten als ein gutes Passwort, und die Informationen sind viel öffentlicher.

21
Dave Liepmann

Ich gehe mit:

  1. Benutzer nach E-Mail fragen, E-Mail überprüfen ist registriert
  2. Generieren Sie eine GUID und senden Sie diese an diese E-Mail
  3. Passwort noch nicht zurücksetzen
  4. Der Benutzer klickt auf den Link und muss dann einen neuen Pass eingeben
  5. Setzen Sie das Passwort erst zurück, nachdem sich der Benutzer auf Ihrer Site befindet und klicken Sie auf die Schaltfläche zum Zurücksetzen, nachdem Sie einen neuen Pass eingegeben haben.
  6. Stellen Sie sicher, dass GUID innerhalb kurzer Zeit abläuft, um die Sicherheit zu erhöhen.
15
andres.santana

Wenn Sie Informationen per E-Mail senden, sind diese nicht sicher. Es gibt zu viele Möglichkeiten, wie jemand darauf zugreifen kann. Es wäre ein Kinderspiel für einen erfahrenen Hacker, der Ihre Informationen stehlen möchte.

Senden Sie keine persönlichen Informationen wie Passwörter und Einkommensinformationen per E-Mail, da diese für Sie und Ihre Organisation SEHR PERSÖNLICH werden können, wenn solche Informationen verloren gehen oder gestohlen werden. Denken Sie ernsthaft über Sicherheit nach. Es dauert nur einen Vorfall, bis alle Steine ​​gefallen sind.

Lesen Sie zum Abrufen des Passworts Best Practices zum Vergessen des Passworts sorgfältig durch.

Unter dem Strich sollte eine Anwendung, die Best Practices befolgt, es einem Benutzer ermöglichen, sein eigenes Kennwort zurückzusetzen. Persönliche Sicherheitsfragen sollten verwendet werden. Die Anwendung sollte keine E-Mails senden, keine Kennwörter anzeigen oder temporäre Kennwörter festlegen.

BEARBEITEN: Link aktualisiert

11
jinsungy

Wie gesagt, es hängt von der erforderlichen Sicherheitsstufe ab. Wenn Sie jedoch eine höhere Stufe benötigen, sind einige der neuartigen Lösungen, die ich gesehen habe, folgende:

  • Zeigt die Hälfte des temporären Passworts an, wenn die Identität des Benutzers bestätigt wurde (Sicherheitsfrage, E-Mail-Adresse usw.), und sendet die andere Hälfte an das E-Mail-Konto. Wenn das E-Mail-Konto kompromittiert wurde, ist es unwahrscheinlich, dass dieselbe Person auch einen Man-in-the-Middle-Angriff ausgeführt hat. (Gesehen auf UK Goverment Gateway)

  • Identitätsbestätigung per E-Mail und einem anderen Medium - zum Beispiel ein Code, der per Text an ein registriertes Mobiltelefon gesendet wird. (Gesehen bei eBay/Paypal)

Denn irgendwo zwischen diesen beiden Extremen könnte die Implementierung von Sicherheitsfragen der richtige Weg sein, wie von DaveG erwähnt.

7
Tom Werner

Wenn Sie bei der Registrierung eine E-Mail-Adresse angeben. Die Schaltfläche "Passwort vergessen" sendet eine E-Mail an diese E-Mail-Adresse. Es stellt sicher, dass die Informationen an eine vertrauenswürdige E-Mail gesendet werden.

(Es sei denn, die Datenbank ist gehackt, aber nichts ist sicher).

6
Toon Krijthe

Hier sind drei sehr gute Links, die Informationen zum Zurücksetzen von Passwörtern enthalten:

  1. http://jtauber.com/blog/2006/03/20/account_management_patterns/

  2. (Benutzer dürfen nicht mit GET bestätigen): http://www.artima.com/forums/flat.jsp?forum=106&thread=152805&start=15&msRange=15

  3. http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf

Hoffentlich hilft das. Sie haben mir sicher geholfen, das Problem zu verstehen.

5
KingAndrew

Ich würde eindeutige E-Mail-Adressen für alle Konten erzwingen.

Dann ist es ganz einfach, einen Link zu einer temporären Seite zu senden, über die die Person ihr Passwort ändern kann. (erlauben Sie 24 Stunden oder weniger)

Das E-Mail-Konto des Benutzers ist in diesem Szenario das schwächste Glied.

4
Andrew Harry

Senden Sie dem Benutzer niemals ein Passwort per E-Mail. Auch wenn es automatisch generiert wird. Bester Ansatz (von SANS und anderen empfohlen und verwendet):

  1. Fragen Sie auf der Seite "Passwort vergessen" den Benutzer nach der E-Mail-Adresse/Benutzer-ID und einem NEUEN Passwort.
  2. E-Mail einen Link zu der gespeicherten E-Mail für dieses Konto mit einem Aktivierungslink.
  3. Wenn der Benutzer auf diesen Link klickt, aktivieren Sie das neue Passwort.

Wenn er nicht innerhalb von 24 Stunden auf den Link klickt, deaktivieren Sie den Link (damit das Passwort nicht mehr geändert wird).

Ändern Sie das Passwort niemals ohne die Zustimmung des Benutzers. Es bedeutet, dass Sie kein neues Passwort per E-Mail senden, nur weil jemand auf den Link "Passwort vergessen" geklickt und den Kontonamen herausgefunden hat.

3
Sucuri