Der beste Weg für eine Implementierung mit vergessenem Passwort? [geschlossen]

153

Ich suche nach der besten Methode, um eine 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 Kennwort an das Benutzer-E-Mail-Konto gesendet. Der Benutzer verwendet das temporäre Passwort zum Anmelden und setzt sein Passwort 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 sichereren 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, sonst kann das temporäre Passwort oder der temporäre Link nicht verwendet werden. Wie geht das?

Zaki
quelle
Ich habe den Beitrag neu markiert, da dies über JSF hinausgeht. Auf diese Weise erhalten Sie wahrscheinlich mehr Antworten.
McDowell
6
@Whoever In diesen Monaten gibt es eine Welle von "Lasst uns diese geschlossene Frage wegen XYZ löschen" auf Meta. Ich möchte nur darauf hinweisen, dass diese spezielle Frage nicht gelöscht werden sollte, es sei denn, es ist erwiesen, dass die Lösungen fehlerhaft sind und dass ihre Existenz mehr schadet, als es dem Fall der Sicherheit hilft.
Félix Gagnon-Grenier
1
OWASP "Spickzettel" für eine Strategie zur Wiederherstellung vergessener Passwörter: owasp.org/index.php/…
daiscog
Der von @megaflop vorgeschlagene Link ist jetzt leider defekt. Hier ist der neue Link: cheatsheetseries.owasp.org/cheatsheets/…
Marco Bolis

Antworten:

185

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 Option, die E-Mail-Adresse anstelle des Benutzernamens einzugeben, da Benutzernamen manchmal auch vergessen werden.
  2. Das System hat eine Tabelle password_change_requestsmit den Spalten ID, Timeund UserID. Wenn der neue Benutzer die Taste drückt, wird ein Datensatz in der Tabelle erstellt. Die TimeSpalte enthält die Zeit, zu der der Benutzer die Schaltfläche "Passwort vergessen" gedrückt hat. Das IDist eine Zeichenfolge. Eine lange zufällige Zeichenfolge wird erstellt (z. B. eine GUID) und dann wie ein Kennwort gehasht (was an und für sich ein separates Thema ist). 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 forgetpassword.jsp sollte in der Lage sein, den ID-Parameter abzurufen. Entschuldigung, ich kenne Java nicht, daher 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 die IDURL ab, hasht sie erneut und vergleicht sie mit der Tabelle. Wenn ein solcher Datensatz vorhanden ist und nicht älter als beispielsweise 24 Stunden ist, wird dem Benutzer die Aufforderung zur Eingabe eines neuen Kennworts angezeigt .
  5. Der Benutzer gibt ein neues Passwort ein, drückt auf OK und alle leben glücklich bis ans nächste Mal!
Vilx-
quelle
1
Der am besten geeignete Weg, dies zu implementieren, wäre - das temporäre Token zum Zurücksetzen des Passworts als E-Mail im Klartext an den Benutzer zu senden (aber niemals als Klartext in der Datenbank zu speichern) - nachdem der Benutzer diese Temperatur eingegeben hat, ihn sofort dazu zu zwingen Geben Sie ein neues Passwort erneut ein. - Stellen Sie für Paranoide sicher, dass Ihr SMTP-Server über SSL verfügt, damit Ihre E-Mails mit vertraulichen Informationen nicht beschnüffelt werden. In den meisten Fällen ist dieser Ansatz ziemlich sicher. Wenn Ihr Fall weitere Sicherheit erfordert, sollten Sie wahrscheinlich keine Benutzer haben, die ihre Passwörter vergessen: S
Kaushik Gopal
6
Warum einen zufälligen String / Guid generieren, hashen und den Hash verwenden? Reicht die Anleitung nicht aus?
Jeroen K
15
@jeroenk - Wenn jemand Ihre Datenbank stiehlt, kann er keinen Link "Passwort zurücksetzen" fälschen und das Passwort einer anderen Person ändern.
Vilx
4
Dies ist im Wesentlichen die beschriebene Methode zum ordnungsgemäßen Zurücksetzen eines Passworts crackstation.net/hashing-security.htm#faq
TruthOf42
1
@ David - Ach, ich wollte den Beitrag bearbeiten, aber das Thema ist gesperrt. :( OK, lassen Sie uns versuchen Sie es erneut: Ihre Tabelle die Spalten enthalten: ID, UserID, Time, TokenHash.. Sie TWO generiert zufällige Zeichenfolgen lang, Legen Sie die erste Saite (die „id“) in der IDSpalte; Hash das zweite (die „Token“ ) und setzen Sie den Hash in die TokenHashSpalte. Die generieren den Link wie forogotPassword.jsp?id=asdasd&token=asdasd. Das Token im Link ist NICHT gehasht. Ist das jetzt sinnvoll?
Vilx
28

Es hängt alles von Ihrer Website und dem Sicherheitsniveau ab, das 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, was eindeutig ist) ein, um ein Zurücksetzen des Passworts anzufordern.

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

  3. Suchen Sie das Benutzerkonto. Speichern Sie ein temporäres Kennwort (normalerweise eine GUID) und einen Zeitstempel für den Kontodatensatz. Senden Sie eine E-Mail an den Benutzer mit dem temporären Kennwort.

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

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

Das Prinzip hier ist, dass dem Benutzer ein temporäres Passwort per E-Mail gesendet wird, mit dem er sie erhält ä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.

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

David Glenn
quelle
24

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

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

  1. Generieren Sie ein neues Passwort auf dem Server und senden Sie es per E-Mail
  2. Senden Sie eine eindeutige URL per E-Mail, um das Zurücksetzen zu erleichtern

Trotz zahlreicher gegenteiliger Anleitungen ist der erste Punkt wirklich nicht der Ort, an dem wir sein wollen. Das Problem dabei ist, dass ein dauerhaftes Kennwort, mit dem Sie jederzeit zurückkehren und es verwenden können, jetzt über einen unsicheren Kanal gesendet wurde und sich in Ihrem Posteingang befindet.

...

Aber es gibt noch ein großes Problem mit dem ersten Ansatz, der die böswillige Sperrung eines Kontos ganz einfach macht. Wenn ich die E-Mail-Adresse von jemandem kenne, der ein Konto auf einer Website besitzt, kann ich ihn jederzeit sperren, indem ich einfach sein Passwort zurücksetze. Es ist ein Denial-of-Service-Angriff, der auf einem Silbertablett serviert wird! Aus diesem Grund sollte ein Reset erst erfolgen, nachdem das Recht des Anforderers 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 mit einem Datensatz auf dem Server neben dem Benutzerkonto abgeglichen werden kann, um zu bestätigen, dass der E-Mail-Kontoinhaber tatsächlich versucht, das zurückzusetzen Passwort. Das Token kann beispielsweise "3ce7854015cd38c862cb9e14a1ae552b" sein und wird in einer Tabelle neben der ID des Benutzers, der den Reset durchführt, und dem Zeitpunkt, zu dem das Token generiert wurde, gespeichert (mehr dazu gleich). Wenn die E-Mail gesendet wird, enthält sie eine URL wie "Zurücksetzen /? Id = 3ce7854015cd38c862cb9e14a1ae552b". Wenn der Benutzer diese lädt, überprüft die Seite das Vorhandensein des Tokens und bestätigt folglich die Identität des Benutzers und lässt das Kennwort zu verändert sein.

...

Das andere, was wir mit einer Rücksetz-URL tun möchten, ist, das Token zeitlich zu begrenzen, so dass der Rücksetzvorgang innerhalb einer bestimmten Dauer, beispielsweise innerhalb einer Stunde, abgeschlossen sein muss.

...

Schließlich möchten wir sicherstellen, dass dies ein einmaliger Prozess ist. Sobald der Rücksetzvorgang abgeschlossen ist, sollte das Token gelöscht werden, damit die Rücksetz-URL nicht mehr funktioniert. Wie beim vorherigen Punkt soll damit sichergestellt werden, dass ein Angreifer ein sehr begrenztes Fenster hat, in dem er die zurückgesetzte URL missbrauchen kann. Außerdem wird das Token natürlich nicht mehr benötigt, wenn der Rücksetzvorgang erfolgreich abgeschlossen wurde.

Er macht noch viele weitere gute Punkte 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 Troy in Bezug auf die Nützlichkeit von Sicherheitsfragen nicht zustimme und Bruce Schneiers Skepsis gegenüber der Praxis bevorzuge :

Der Sinn all dieser Fragen ist der gleiche: ein Sicherungskennwort. Wenn Sie Ihr Passwort vergessen haben, kann die geheime Frage Ihre Identität überprüfen, sodass Sie ein anderes Passwort auswählen oder die Site Ihr aktuelles Passwort per E-Mail an Sie senden können. Aus Sicht des Kundendienstes ist dies eine großartige Idee - ein Benutzer vergisst weniger wahrscheinlich 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.

Dave Liepmann
quelle
1
Dieser Link enthält klare NSFW-Bilder. Es gibt einen Link, um dies zu ändern, aber viele Leute scannen zuerst eine Seite. Dumme Idee!
Nik0lai
Der Link zu Troy Hunts Artikel hat sich geändert. Goto troyhunt.com/everything-you-ever-wanted-to-know
knarfancho
@knarfancho Behoben, danke!
Dave Liepmann
15

Ich werde gehen mit:

  1. Bitten Sie den Benutzer um eine E-Mail. Überprüfen Sie, ob die E-Mail registriert ist
  2. Generieren Sie eine GUID und senden Sie sie 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 Website befindet und nach Eingabe eines neuen Passes auf die Schaltfläche "Zurücksetzen" geklickt hat.
  6. Machen Sie diese GUID innerhalb kurzer Zeit ablauffähig, um sie sicherer zu machen.
andres.santana
quelle
Ich möchte nicht in Schwierigkeiten geraten, wenn ich einen frage? aber es hängt mit Ihrer Antwort zusammen. Wie generieren Sie die GUID?
KingAndrew
2
-1, weil Sie keinen Hash für den Link implementiert haben, den Sie an die Person
senden
11

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

Senden Sie keine persönlichen Informationen wie Passwörter und Einkommensinformationen per E-Mail, da dies für Sie und Ihr Unternehmen SEHR Peinlich werden kann, wenn solche Informationen durchgesickert oder gestohlen wurden. Denken Sie ernsthaft über Sicherheit nach. Es dauert nur diesen einen Vorfall, bis alle Steine ​​gefallen sind.

Lesen Sie zum Abrufen von Passwörtern die Best Practices für Passwort vergessen .

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

jinsungy
quelle
Ich habe den Link für Best Practices für vergessenes Passwort ausprobiert und einen 500-Server-Fehler erhalten. Glaubst du, der Server ist gerade ausgefallen oder gibt es einen anderen Link, dem du folgen kannst?
KingAndrew
Der Link ist wieder tot.
Eric Cope
7

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

  • Anzeige der Hälfte des temporären Passworts, wenn die Identität des Benutzers bestätigt wurde (Sicherheitsfrage, E-Mail-Adresse usw.), dann wird die andere Hälfte an das E-Mail-Konto gesendet. 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)

  • Bestätigung der Identität per E-Mail und einem anderen Medium - zum Beispiel einem 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.

Tom Werner
quelle
6

Wenn Sie der Registrierung eine E-Mail-Adresse hinzufügen. 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 wird gehackt, aber dann ist nichts sicher).

Toon Krijthe
quelle
5

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. (Lassen Sie Benutzer 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.

KingAndrew
quelle
4

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

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

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

Andrew Harry
quelle
2

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

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

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 Zustimmung des Benutzers. Es bedeutet, dass Sie kein neues Passwort per E-Mail senden, nur weil jemand auf den Link für das vergessene Passwort geklickt und den Kontonamen herausgefunden hat.

Sucuri
quelle
13
Ich beschäftige mich mit dieser Technik. Der Angreifer gibt Ihre E-Mail-Adresse und ein NEUES Passwort ein. Der Kontoinhaber erhält die E-Mail, liest etwas falsch und klickt auf den Link. Der Angreifer, der bereitsteht und jede Minute ein neues Passwort versucht, erhält Zugriff auf das Konto, bis der Kontoinhaber erkennt, was passiert ist, und schließlich zur Seite "Passwort vergessen" wechselt.
Odi - Xceed
Ein anderes Problem! Die Angabe eines neuen Passworts zum Zeitpunkt des Zurücksetzens des Passworts ist keine gute Option. Ich kann das neue Passwort wieder vergessen, wenn ich meine E-Mails nach Stunden überprüft habe!
Yazid Erman