it-swarm.com.de

Wie implementiere ich die Funktion "Passwort vergessen"?

Für mein Projekt benötige ich eine " Passwort vergessen" Funktion.

Ich bin mir noch nicht ganz sicher, wie ich diese Art von Funktionalität implementieren soll, also hatte ich gehofft, einige "Best Practices" im Internet zu finden, konnte aber nichts Nützliches finden, das jeden wichtigen Aspekt dieser recht häufigen Funktion behandelt.


Meine eigenen Gedanken dazu sind ziemlich einfach:

Wenn ein Benutzer sein Passwort ändern möchte, kann ich ein eindeutiges Token uniqueTokenForTheUser erstellen, das an eine "Passwortanforderung ändern" angehängt ist. Dies ist im Wesentlichen die Kennung für mein Backend, um festzustellen, ob es der richtige Benutzer war, der die Anfrage gesendet hat.

So würde ich zum Beispiel eine E-Mail mit einem Link an [email protected] Generieren/senden

http://www.example.com/changePassword?token=uniqueTokenForTheUser

uniqueTokenForTheUser wird in einer Tabelle gespeichert, die in einem bestimmten Intervall von einem Thread überprüft wird und den Datensatz nach Ablauf des Tokens entfernt, falls der Benutzer sein Kennwort nicht tatsächlich geändert hat.

Obwohl dies für mich ziemlich einfach klingt, wollte ich noch einmal überprüfen, ob es da draußen "Best Practices" gibt, z. wenn es um die Erzeugung und Löschung dieses bestimmten Tokens geht.

Anregungen oder Verweise auf Artikel/Tutorials sind willkommen!


Zusätzliche durch Kommentare vorgeschlagene Links:

71
displayname

Verwenden Sie nur HTTPS, und wir werden uns dann mit den Details der Implementierung befassen.

Zunächst möchten Sie sich vor Benutzeraufzählung schützen.

Geben Sie auf der Seite nicht an, ob der Benutzer vorhanden ist oder nicht. Dies sollte nur in der E-Mail selbst angegeben werden.

Zweitens möchten Sie Referrer-Leckage vermeiden. Stellen Sie sicher, dass auf Ihrem Ziellink keine externen Links oder externen Ressourcen vorhanden sind. Eine Möglichkeit, dies zu verringern, besteht darin, umzuleiten, nachdem der anfängliche Link befolgt wurde, sodass sich das Token nicht mehr in der Abfragezeichenfolge befindet. Beachten Sie, dass wenn etwas schief geht (z. B. Ihre Datenbank kurzzeitig ausgefallen ist) und eine Standardfehlervorlage angezeigt wird, dies dazu führen kann, dass das Token durchgesickert ist, falls es externe Referenzen enthält.

Generieren Sie mit einem CSPRNG ein Token mit 128 Bit Entropie. Speichern Sie diese serverseitige Datei mit SHA-2, um zu verhindern, dass Datenverletzungsschwachstellen in Ihrer Rücksetztabelle es einem Angreifer ermöglichen, Kennwörter zurückzusetzen. Beachten Sie, dass kein Salz benötigt wird. Verfallen diese Token nach kurzer Zeit (z. B. nach einigen Stunden).

Geben Sie dem Benutzer nicht nur das nicht gehashte Token im E-Mail-Link, sondern geben Sie dem Benutzer auch die Möglichkeit, manuell zur Seite zu navigieren und dann den Token-Wert einzufügen. Dies kann verhindern, dass Abfragezeichenfolgenwerte standardmäßig im Browserverlauf und in Proxy- und Serverprotokollen protokolliert werden.

Optional möchten Sie möglicherweise sicherstellen, dass die Sitzungskennung für die Sitzung, die das Zurücksetzen des Kennworts initiiert hat, diejenige ist, die dem Link gefolgt ist . Dies kann zum Schutz eines Kontos beitragen, bei dem der Angreifer Zugriff auf die E-Mail-Adresse des Benutzers hat (z. B. das Einrichten einer Schnellvorlaufregel für alle mit eingeschränktem Zugriff auf das E-Mail-Konto). Dies verhindert jedoch wirklich, dass ein Angreifer einem vom Benutzer angeforderten Zurücksetzen opportunistisch folgt. Der Angreifer kann dennoch ein eigenes Rücksetz-Token für das Opfer anfordern, falls er auf Ihre bestimmte Site abzielen möchte.

Sobald das Passwort auf eine vom Benutzer gewählte zurückgesetzt wurde, müssen Sie das Token ablaufen lassen und dem Benutzer eine E-Mail senden, um ihn darüber zu informieren, dass dies geschehen ist, falls ein Angreifer es irgendwie geschafft hat, sein Passwort zurückzusetzen (ohne unbedingt die Kontrolle zu haben) ihres Postkontos) - Verteidigung in der Tiefe. Sie sollten auch die aktuelle Sitzungskennung drehen und alle anderen für dieses Benutzerkonto ablaufen lassen . Dies macht es unnötig, dass sich der Benutzer erneut anmelden muss, während alle von einem Angreifer gerittenen Sitzungen gelöscht werden. Einige Benutzer möchten jedoch, dass die Site sie abmeldet, damit sie eine komfortable Bestätigung erhalten, dass ihr Kennwort tatsächlich zurückgesetzt wurde. Durch das Umleiten auf die Anmeldeseite können einige Kennwortmanager auch die Anmelde-URL und das neue Kennwort speichern, obwohl viele das neue Kennwort bereits auf der Rücksetzseite erkennen.

Möglicherweise möchten Sie auch andere Out-of-Band-Optionen für den Rücksetzmechanismus und die Änderungsbenachrichtigungen in Betracht ziehen. Zum Beispiel durch SMS oder Handy-Benachrichtigungen.

69
SilverlightFox

Ihre Denkrichtung ist auf dem richtigen Weg. Ich würde jedoch vorschlagen, den Ablauf für Ihre Funktionalität für vergessene Kennwörter einen Schritt früher zu beschreiben. Jemand behauptet, sein Passwort vergessen zu haben. Sie müssen sicherstellen, dass Sie feststellen, dass diese Person tatsächlich der Eigentümer des Kontos ist, für das Sie das Passwort starten Wiederherstellungsverfahren.

Der folgende Ablauf setzt einen Dienst voraus, bei dem sich Benutzer anmelden können, z. B. eine Website (mit anderen Worten, eine Liste registrierter E-Mails und/oder Benutzernamen kann mithilfe der Anmeldefunktion erstellt werden).

Schritt eins: Benutzer identifizieren

  1. Wenn Sie auf den Link "Ups, ich habe mein Passwort vergessen" klicken, präsentieren Sie dem Benutzer ein Formular, in dem er seinen Benutzernamen und seine E-Mail-Adresse eingibt (optional geben Sie ihm einen Hinweis auf die E-Mail-Adresse in Form von: 's ..... @ o .... com ');
  2. informieren Sie sie, wenn die von ihnen eingegebene E-Mail-Adresse zu dem von ihnen eingegebenen Benutzernamen gehört (Ja oder Nein).
  3. Wenn der eingegebene Benutzername und das eingegebene Passwort übereinstimmen, fahren Sie mit den nächsten Schritten fort.

Schritt zwei: Wiederherstellungsverfahren starten

  1. ein zufälliges Wiederherstellungs-Token generieren (128 Bit sollten in Ordnung sein);
  2. speichern Sie einen Hash dieses Tokens (erstellt mit einem Passwort-Hashing-Algorithmus) zusammen mit seinem Erstellungszeitstempel in Ihrer Datenbank.
  3. senden Sie dem Benutzer eine E-Mail mit einem Link (der das Wiederherstellungstoken enthält) zu einem Formular zum Ändern des Kennworts. Die URL für das Formular zum Ändern des Kennworts sollte HTTPS sein.
  4. wenn Sie die Anforderung zum Ändern des Passworts erhalten, überprüfen Sie: [1]. die Gültigkeit des Tokens (unter Verwendung seiner Erstellungszeit im Vergleich zur aktuellen Zeit sollte normalerweise ein Zeitfenster von 10 Minuten ausreichen); [2]. Wenn das angezeigte Token korrekt ist (Hash des Tokens, vergleichen Sie den resultierenden Hash mit dem in Ihrer Datenbank, genau wie Sie es für ein Passwort tun würden);
  5. wenn alle Prüfungen bestanden sind, fahren Sie mit dem nächsten Schritt fort.

Schritt drei: Aktualisieren Sie das Passwort

  1. zerstören Sie alle Informationen, die Sie möglicherweise für diesen Benutzer gespeichert haben.
  2. alle mit diesem Benutzer verbundenen aktiven Sitzungen zerstören;
  3. das Passwort des Benutzers aktualisieren;
  4. optional können Sie eine E-Mail an ihre E-Mail-Adresse senden, um sie über die Änderung zu informieren.
  5. melden Sie den Benutzer an.
13
Jacco

Mit Ihrem Ansatz sind Sie der Best Practice nahe. Eine kleine Ergänzung wäre:

  • Möglicherweise muss der Benutzername mit dem Token übereinstimmen, anstatt nur den Benutzer vom Token abzuziehen.

  • Sie sollten lieber https als http verwenden.

Die anderen Fragen:

  • Bezüglich der Generierung: Eine übliche Methode zum Generieren dieser UUIDs ist die Verwendung von UUIDs. Wie Kommentare jedoch hervorheben, sollten Sie lieber eine vollständig zufällige, ausreichend lange Zeichenfolge verwenden.

  • Zum Löschen: Sie können alte, nicht verwendete Token regelmäßig bereinigen, wie Sie vorgeschlagen haben. Verwenden Sie möglicherweise einen Zeitrahmen, der es der E-Mail ermöglicht, das übliche E-Mail-Graylisting zu durchlaufen, z. 15 Minuten.

7
Tobi Nary

Einige Gedanken dazu:

  • E-Mail ist von Natur aus unsicher. Das Token kann von einem Angreifer irgendwo zwischen Ihrem Server und dem Posteingang des Benutzers gestohlen werden. Verwenden Sie nach Möglichkeit ein anderes Kommunikationsmedium, z. B. SMS.
  • Wenn Sie per E-Mail gehen, sollte der Wiederherstellungslink über HTTPS und nicht über HTTP erfolgen. Zumindest dieser Teil des Prozesses kann verschlüsselt werden.
  • Um Angriffe auf die Benutzeraufzählung zu verhindern, möchten Sie möglicherweise denselben Nachrichten-Wheater anzeigen oder nicht. Der Benutzername/die E-Mail-Adresse, die der Benutzer eingibt, ist vorhanden oder nicht. (Machen Sie zumindest nicht den Fehler, die E-Mail anzuzeigen, nachdem der Benutzer nur den Benutzernamen eingegeben hat.)
  • Verwenden Sie einen guten Pseudozufallszahlengenerator und einen langen Token. Niemand sollte in der Lage sein, das Zeichen zu erraten. Um das Erraten von Token zu erschweren, muss der Benutzer sowohl den Benutzernamen als auch das Token eingeben. Durch die Begrenzung der Anzahl der Versuche (pro Benutzername und/oder IP) wird auch Brute-Forcing verhindert. Vielleicht auch ein CAPTCHA?
  • Sie möchten einschränken, wie lange ein Token gültig ist. E-Mails mögen langsam sein, wenn sie in Filtern stecken bleiben, aber ich kann keinen Grund erkennen, warum jemand mehr als eine halbe Stunde brauchen würde.
  • Beenden Sie nach Wiederherstellung eines Kontos alle alten Sitzungen für dieses Konto. Der Benutzer möchte das Konto möglicherweise wiederherstellen, da es kompromittiert wurde. Anschließend sollte der Angreifer abgemeldet werden.
  • Senden Sie nur ein One-Use-Token und kein neues Passwort! Passwörter sollten niemals per E-Mail gesendet werden.
  • Erlaube nur einmal, einen Token zu verwenden! Löschen Sie es sofort nach seiner Verwendung (auch wenn der Benutzer das Passwort nicht tatsächlich ändert).

Für weitere Informationen zum Thema empfehle ich Troy Hunt .

4
Anders