Ich suche nach der besten Methode, um eine Funktion "Passwort vergessen" zu implementieren.
Ich komme mit 2 Ideen heraus:
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.
Ä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?
Antworten:
Update: überarbeitet im Mai 2013 für einen besseren Ansatz
password_change_requests
mit den SpaltenID
,Time
undUserID
. Wenn der neue Benutzer die Taste drückt, wird ein Datensatz in der Tabelle erstellt. DieTime
Spalte enthält die Zeit, zu der der Benutzer die Schaltfläche "Passwort vergessen" gedrückt hat. DasID
ist 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.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.ID
URL 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 .quelle
ID
,UserID
,Time
,TokenHash
.. Sie TWO generiert zufällige Zeichenfolgen lang, Legen Sie die erste Saite (die „id“) in derID
Spalte; Hash das zweite (die „Token“ ) und setzen Sie den Hash in dieTokenHash
Spalte. Die generieren den Link wieforogotPassword.jsp?id=asdasd&token=asdasd
. Das Token im Link ist NICHT gehasht. Ist das jetzt sinnvoll?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:
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.
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.
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.
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.
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.
quelle
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:
...
...
...
...
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 :
quelle
Ich werde gehen mit:
quelle
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 .
BEARBEITEN: Link aktualisiert
quelle
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.
quelle
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).
quelle
Hier sind drei sehr gute Links, die Informationen zum Zurücksetzen von Passwörtern enthalten:
http://jtauber.com/blog/2006/03/20/account_management_patterns/
(Lassen Sie Benutzer nicht mit GET bestätigen): http://www.artima.com/forums/flat.jsp?forum=106&thread=152805&start=15&msRange=15
http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf
Hoffentlich hilft das. Sie haben mir sicher geholfen, das Problem zu verstehen.
quelle
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.
quelle
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):
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.
quelle