PHP-Funktion „Passwort vergessen“.

Lesezeit: 7 Minuten

Benutzer-Avatar
Liam

Ich habe eine kleine Community-Website und muss eine Art Passwort-Vergessen-Funktion implementieren. Ich speichere derzeit die Passwörter in der DB, verschlüsselt mit MD5.

Ist es möglich, es zu entschlüsseln und per E-Mail an den Benutzer zu senden, oder benötige ich eine Seite zum Zurücksetzen des Passworts?

  • Die ganze Idee beim Speichern von Passwörtern MD5-codiert ist, dass Sie sie nicht entschlüsseln können. Selbst wenn jemand in Ihr System einbricht und die DB ausgibt, kann er das Passwort nicht bekommen (es sei denn, die Passwörter sind zu schwach, aber das ist eine andere Geschichte …)

    – Karoly Horvath

    5. Juli 2011 um 16:11 Uhr


Benutzer-Avatar
Jared Cobb

Ein MD5-gehashtes Passwort ist nicht umkehrbar. (MD5 hasht und verschlüsselt nicht wirklich, also gibt es einen feinen Unterschied). Und Jawohl Sie sollten auf jeden Fall einen Prozess zum Zurücksetzen des Passworts bereitstellen (und nicht einfach das Passwort per E-Mail versenden).

Um Ihnen einen Workflow auf hohem Niveau für sichere Passwortzurücksetzungen zu bieten…

  1. Wenn der Benutzer darum bittet, sein Passwort zurückzusetzen, lassen Sie ihn seine E-Mail-Adresse eingeben
  2. Geben Sie nicht an, ob diese E-Mail-Adresse gültig war oder nicht (sagen Sie einfach, dass eine E-Mail versendet wurde). Dies kann diskutiert werden, da es die Benutzerfreundlichkeit verringert (dh ich habe keine Ahnung, mit welcher E-Mail-Adresse ich mich registriert habe), aber es bietet weniger Informationen für Personen, die versuchen, Informationen darüber zu sammeln, welche E-Mails tatsächlich auf Ihrer Website registriert sind.
  3. Generieren Sie ein Token (vielleicht hashen Sie einen Zeitstempel mit einem Salt) und speichern Sie es in der Datenbank im Datensatz des Benutzers.
  4. Senden Sie eine E-Mail an den Benutzer zusammen mit einem Link zu Ihrem https Seite zurücksetzen (Token und E-Mail-Adresse in der URL).
  5. Verwenden Sie das Token und die E-Mail-Adresse, um den Benutzer zu validieren.
  6. Lassen Sie sie ein neues Passwort wählen und das alte ersetzen.
  7. Darüber hinaus ist es eine gute Idee, diese Token nach einem bestimmten Zeitrahmen, normalerweise 24 Stunden, ablaufen zu lassen.
  8. Zeichnen Sie optional auf, wie viele “Vergessene” Versuche stattgefunden haben, und implementieren Sie möglicherweise komplexere Funktionen, wenn Benutzer eine Menge E-Mails anfordern.
  9. Notieren Sie optional (in einer separaten Tabelle) die IP-Adresse der Person, die das Zurücksetzen anfordert. Erhöhen Sie eine Zählung von dieser IP. Wenn es jemals mehr als, sagen wir, 10 erreicht, ignoriere ihre zukünftigen Anfragen.

Um Ihnen etwas mehr Details zum Hashing zu geben …

Wenn Sie einen Wert wie ein Passwort mit der Funktion md5() in PHP hashen, ist der endgültige Wert für dieses Passwort gleich, egal auf welchem ​​Server Sie es ausführen. (Es gibt also einen Unterschied, den wir sofort zwischen Hashing und Verschlüsselung sehen können … Es ist kein privater/öffentlicher Schlüssel beteiligt).

Hier werden Sie also Leute sehen, die eine Schwachstelle erwähnen Regenbogentische. Eine sehr einfache Erklärung einer Regenbogentabelle ist … Sie md5() hashen eine Reihe von Wörtern aus dem Wörterbuch (schwache Passwörter), um ihre md5() gehashten Werte zu erhalten. Setzen Sie diese in eine Datenbanktabelle (Regenbogentabelle).

Wenn Sie nun die Datenbank einer Website kompromittieren, können Sie die gehashten Passwörter der Benutzer mit Ihrer Regenbogentabelle vergleichen, um den Hash (im Wesentlichen) wieder in ein Passwort „umzukehren“. (Sie “umkehren” den Hash nicht wirklich … Aber Sie bekommen die Idee).

Hier ist es am besten, Ihre Passwörter zu “salzen”. Dies bedeutet (wiederum eine sehr grundlegende Idee hier), dass Sie einen zufälligen Wert an die Passwörter der Benutzer anhängen Vor du hashst es. Wenn die Rainbow-Tabelle jetzt gegen Ihre Datenbank ausgeführt wird, ist sie nicht so einfach “umzukehren”, da der md5()-Hash von “password” anders ist als “password384746”.

Hier ist ein nettes SO Q/A, das helfen sollte. Sicherer Hash und Salt für PHP-Passwörter

  • @Jared Cobb: Was meinst du genau mit 8.?

    – testen

    8. Februar 2013 um 14:34 Uhr

  • @testing Gute Frage … Es ist Punkt 9 sehr ähnlich, außer dass der Angreifer in diesem Szenario ein Botnet, einen Proxy oder eine andere Round-Robin-Methode verwendet, um Sie jedes Mal von einer anderen IP-Adresse aus zu treffen. Wenn Ihr System beispielsweise feststellt, dass innerhalb weniger Minuten oder Stunden eine enorme Zunahme von „Forgot Requests“ auftritt, können Sie die Funktion vorübergehend verlangsamen oder deaktivieren. (Natürlich wird Ihr Schwellenwert durch Ihr eigenes subjektives Urteil über die Größe Ihrer Benutzerbasis und das, was als “normales” Volumen angesehen wird, bestimmt).

    – Jared Cobb

    8. Februar 2013 um 21:53 Uhr

  • @JaredCobb #7 Ich generiere normalerweise direkt nach dem Zurücksetzen des Passworts ein neues Token, also muss er das nächste Mal ein neues Token verwenden, um das Passwort zurückzusetzen.

    – Ing. Michal Hudak

    12. Dezember 2013 um 10:13 Uhr

  • Kann ich das Passwort des vorherigen Benutzers verwenden? (das gehasht und in der Datenbank gespeichert wird) als dieses zufällige Token (für den dritten Schritt)? Eigentlich brauche ich das, um es als Argument für diese Reset-URL zu übergeben. Kann ich das machen?

    – Stapel

    24. Juni 2016 um 1:29 Uhr

  • @Thoaren Sie zu zwingen, ihren Benutzernamen anzugeben, ist meiner Meinung nach optional. Ich glaube nicht, dass es zusätzliche Sicherheit bietet. Wenn jemand den Link (betrügerisch) vom E-Mail-Konto des Benutzers erhalten hat, hat er das Konto vermutlich bereits kompromittiert dein Website ebenso. Wenn die E-Mail-Adresse des Benutzers ist Ihr Benutzername wäre wiederum ein strittiger Punkt.

    – Jared Cobb

    15. Januar 2017 um 23:24 Uhr

Benutzer-Avatar
Mansur Khan

Laut diesem Beitrag Die endgültige Anleitung zur formularbasierten Website-Authentifizierung für Schritt 3. und 4. bin ich mir nicht sicher, ob Sie dasselbe Token senden sollten, das Sie speichern.

Ich denke, Sie müssen das Token senden, es dann hashen und das Hash-Token in DB speichern. Andernfalls, wenn Ihre Datenbank kompromittiert ist, kann man auf die Seite zum Zurücksetzen des Passworts zugreifen.

Zusammenfassen :

$token = md5(microtime (TRUE)*100000);
$tokenToSendInMail = $token;
$tokenToStoreInDB = hash($token);

wobei Hash ein Hash-Algorithmus ist.

  • Das ist ein wirklich guter Punkt, das Hash-Token in DB zu speichern. +1

    – Avenor

    30. Juli 2013 um 8:28 Uhr

  • Die Verwendung eines vorhersehbaren Tokens ist jedoch keine gute Idee … Es sollte nicht auf etwas Vorhersehbarem wie der Zeit basieren. (Es würde einem Angreifer ermöglichen, die Werte ungefähr zu dem Zeitpunkt zu durchlaufen, zu dem das Token generiert wurde.) In PHP7, random_bytes sollte benutzt werden. Auf PHP5 ist die Kompatibilitätsimplementierung bzw openssl_random_pseudo_byte sollte benutzt werden.

    – Gert van den Berg

    22. März 2016 um 11:52 Uhr

  • (Eine andere Möglichkeit besteht darin, einen Hash aus einer geheimen Zufallszeichenfolge und den Details des Benutzers und hoffentlich einigen anständigen Zufallsdaten zu verwenden. Da es in der DB gespeichert wird, gibt es keinen Grund dafür, dass das Token vorhersehbar ist) (mit dieser Methode, I würde das Token mit generieren password_hash auf die lange Zeichenfolge und senden Sie eine base64-codierte Version des Hashs im Link). (Ein erneutes Hashing vor dem Speichern in der DB könnte ebenfalls eine Option sein, aber das Ablaufen des Reset-Links nach 4-24 Stunden ist wahrscheinlich eine bessere Verteidigung) (mit richtigen Zufallsdaten sollte es in Ordnung sein, nur die Datenbank 64-codiert zu senden)

    – Gert van den Berg

    22. März 2016 um 12:03 Uhr

Nein, MD5 ist irreversibel. Der Zweck des Hashings von Passwörtern besteht darin, dass ein Angreifer, der Zugriff auf Ihre Datenbank erhält, nicht auf die Passwörter aller zugreifen kann.

Allerdings kann MD5 (insbesondere ungesalzenes MD5) im Allgemeinen mit a angegriffen werden Regenbogentisch. Aus Sicherheitsgründen sollten Sie besser verwenden bcrypt.

Sie können das Passwort nicht entschlüsseln, und Sie sollten nicht einmal daran denken, ein Passwort per Klartext an einen Benutzer zu senden. (Das ist der beste Weg, um mich dazu zu bringen, eine Website nie wieder zu benutzen; es ist eine GIGANTISCHE Sicherheitslücke.) Stellen Sie eine Seite zum Zurücksetzen des Passworts bereit, die von einem Link mit einem zeitbezogenen Schlüssel ausgelöst wird, der an die E-Mail zur Passwortwiederherstellung des Benutzers gesendet wird ; das ist der aktuelle Stand der Technik bei der Passwortwiederherstellung.

Das Beste, was Sie tun können, ist, die Leute aufzufordern, ihre E-Mail-Adresse bei der Registrierung anzugeben. Wenn sie es vergessen, haben Sie einen Link für vergessenes Passwort, der ihr Passwort mit einem zufälligen Wert zurücksetzt, der ihnen per E-Mail zugesendet wird, damit sie Zugriff erhalten und ihr Passwort dann wieder auf etwas Merkwürdigeres ändern können. Auf diese Weise müssen Sie die Sicherheit nicht gefährden. Sie könnten einen Link haben, in den sie nur ihren Benutzernamen eingeben müssen, aber für eine bessere Sicherheit sollten Sie eine Frage und Antwort oder ein einprägsames Wort haben.

Benutzer-Avatar
Chris

Wie Marcus Reed feststellte, verwenden Sie 2015/2016, wenn Sie eine PHP-Version> = 5.5 haben, MD5 nicht, password_hash() und password_verify() bieten ein einfaches und sicheres Hashing für Ihr Passwort mit der Möglichkeit, Kosten bereitzustellen und automatisch zu salzen Hasch.

Ich habe derzeit keine Möglichkeit, abzustimmen oder zu kommentieren, weshalb ich eine endgültige Aussage mache, um Verwirrung zu vermeiden.

Benutzer-Avatar
Ignacio Vazquez-Abrams

MD5 soll ein Einweg-Hash sein. Sie müssen sie bitten, ihr Passwort zurückzusetzen.

1225420cookie-checkPHP-Funktion „Passwort vergessen“.

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy