wake-up-neo.com

PHP Passwort vergessen Funktion

Ich habe eine kleine Community-Website und muss eine Art Funktion für vergessene Kennwörter implementieren. Ich speichere momentan die Passwörter in der DB, verschlüsselt mit MD5 .

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

36
Liam

Ein MD5-Hash-Passwort ist nicht umkehrbar. (MD5 ist Hashing und nicht wirklich verschlüsselt, es gibt also einen subtilen Unterschied). Und ja Sie möchten auf jeden Fall einen Prozess zum Zurücksetzen des Kennworts bereitstellen (und nicht einfach das Kennwort per E-Mail senden).

Um Ihnen einen übergeordneten Workflow für das Zurücksetzen sicherer Kennwörter zu bieten ...

  1. Wenn der Benutzer zum Zurücksetzen seines Passworts aufgefordert wird, muss er seine E-Mail-Adresse eingeben
  2. Geben Sie nicht an, ob diese E-Mail-Adresse gültig war oder nicht (teilen Sie ihnen einfach mit, dass eine E-Mail versendet wurde). Dies ist offen für Diskussionen, da es die Benutzerfreundlichkeit beeinträchtigt (d. H. Ich habe keine Ahnung, mit welcher E-Mail 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 (möglicherweise einen Zeitstempel mit einem Salt) und speichern Sie es in der Datenbank im Datensatz des Benutzers.
  4. Senden Sie dem Benutzer eine E-Mail mit einem Link zu Ihrer http s Rücksetzseite (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, das das alte ersetzt.
  7. Darüber hinaus ist es eine gute Idee, diese Token nach einem bestimmten Zeitraum, normalerweise 24 Stunden, abzulaufen.
  8. Optional können Sie aufzeichnen, wie viele "vergessene" Versuche stattgefunden haben, und möglicherweise komplexere Funktionen implementieren, wenn viele E-Mails angefordert werden.
  9. Notieren Sie optional (in einer separaten Tabelle) die IP-Adresse der Person, die das Zurücksetzen anfordert. Erhöhe die Anzahl von dieser IP. Wenn es jemals mehr als, sagen wir, 10 erreicht ... Ignorieren Sie ihre zukünftigen Anfragen.

Um Ihnen ein bisschen mehr Details zum Hashing zu geben ...

Wenn Sie mit der Funktion md5 () in PHP einen Wert wie ein Kennwort haben, ist der endgültige Wert für dieses Kennwort derselbe, unabhängig davon, auf welchem ​​Server Sie es ausführen. (Es gibt also einen Unterschied zwischen Hashing und Verschlüsselung. Es ist kein privater/öffentlicher Schlüssel beteiligt.).

Hier werden Sie sehen, wie Leute eine Schwachstelle für Rainbow-Tabellen erwähnen. Eine sehr grundlegende Erklärung für eine Rainbow-Tabelle ist ... Sie haben mit md5 () eine Reihe von Wörterbuchwörtern (schwache Passwörter) gehasht, um ihre md5 () -Hash-Werte zu erhalten. Legen Sie diese in eine Datenbanktabelle (Rainbow-Tabelle).

Wenn Sie die Datenbank einer Website gefährden, können Sie die gehashten Kennwörter der Benutzer für Ihre Rainbow-Tabelle ausführen, um den Hash (im Wesentlichen) in ein Kennwort umzukehren. (Sie "kehren" den Hash nicht wirklich um ... Aber Sie haben die Idee).

Das ist die beste Methode, um Ihre Passwörter zu "salzen". Dies bedeutet (auch hier eine sehr grundlegende Idee), dass Sie einen zufälligen Wert an die Passwörter der Benutzer anhängen , bevor Sie sie hashen . Wenn die Rainbow-Tabelle nun für Ihre Datenbank ausgeführt wird, kann sie nicht so einfach "rückgängig gemacht" werden, da der md5 () -Hash von "password" sich von "password384746" unterscheidet.

Hier ist eine nette SO Q/A, die helfen sollte. Secure Hash und Salt für PHP Passwörter

134
Jared Cobb

Gemäß 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 vermute, Sie müssen das Token senden, es dann hacken und das gehackte Token in der Datenbank speichern. Andernfalls kann auf die Seite zum Zurücksetzen des Kennworts zugegriffen werden, wenn Ihre Datenbank gefährdet ist.

Zusammenfassen :

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

dabei ist Hash ein Hash-Algorithmus.

9
Mansur Khan

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

Das heißt, MD5 (insbesondere ungesalzenes MD5) kann im Allgemeinen mit einem Rainbow-Tabelle angegriffen werden. Aus Sicherheitsgründen ist es besser, bcrypt zu verwenden.

7
ceejayoz

Am besten fordern Sie die Benutzer bei der Registrierung auf, ihre E-Mail-Adresse anzugeben. Wenn sie dann vergessen haben, haben sie einen Link für ein vergessenes Passwort, der ihr Passwort mit einem zufälligen Wert zurücksetzt, der ihnen per E-Mail zugeschickt wird, damit sie Zugang erhalten und ihr Passwort wieder in etwas Erinnerungswerteres ä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.

3
tom

Sie können das Kennwort nicht entschlüsseln, und Sie sollten nicht einmal in Betracht ziehen, einem Benutzer ein Kennwort als Klartext zu senden. (Auf diese Weise kann ich eine Website nie wieder verwenden. Es handelt sich um eine GIGANTISCHE Sicherheitslücke.) Stellen Sie eine Seite zum Zurücksetzen des Kennworts bereit, die über einen Link mit einem zeitbezogenen Schlüssel ausgelöst wird, der an die E-Mail zum Wiederherstellen des Kennworts des Benutzers gesendet wird ; Das ist der aktuelle Stand der Technik in der Passwortwiederherstellung.

3
Paul Sonier

Wie Marcus Reed feststellte, bieten in 2015/2016, wenn Sie PHP version> = 5.5 nicht verwenden, password_hash () und password_verify () ein einfaches und sicheres Hashing für Ihr Kennwort mit dem Fähigkeit, Kosten bereitzustellen und den Hash automatisch zu salzen.

Ich kann derzeit nicht abstimmen oder kommentieren, weshalb ich eine endgültige Erklärung vorlege, um Verwirrung zu vermeiden.

3
Chris

MD5 soll ein One-Way-Hash sein. Sie müssen ihr Passwort zurücksetzen.

Verwenden Sie PHP in password_verify und password_hash.

2
Marcus Reed

Schreiben Sie eine Seite, die die MD5- und E-Mail-Adresse als Get-Parameter akzeptiert und in der Datenbank nach der E-Mail-Adresse und dem MD5-Kennwort sucht. Wenn Sie Jared Cobbs Notizen folgen, sollten Sie auf dem richtigen Weg sein. Ich habe nur einige Beispiele hinzugefügt

zB URL zum Senden http://IhreDomain.com/ResetPassword.PHP?Code=MD5CODENTVIAEMAIL

 $code = isset($_GET['code']) ? $_GET['code'] : '';
    $email = isset($_GET['email']) ? $_GET['email'] : '';
$checkPw = '';

    if(empty($code) || empty($email))
    {
     die();
    }
    $sqlQuery = 'SELECT * FROM users WHERE email = "'.$email.'";
//remember to check for sql injections
    //then get the results as an array, i use a database class eg $user

    if(!empty($user['password']))
    {
     $checkPw = md5($user['password']);
    }else
    {
     die();
    }

    if($checkPw !== $code)
    {
     die();
    }else
    {
    //display form for user to change password
    }

dies sollte ausreichen, damit Sie wissen, dass der Benutzer ein gültiger Benutzer ist, und um sein Kennwort zu ändern

2
Ryan

Nein, Sie können es nicht entschlüsseln. das ist die ganze idee.

Sie müssten ihnen ein temporäres Kennwort senden, damit sie es zurücksetzen können.

1
Neal

Sie müssen eine Seite zum Zurücksetzen des Kennworts erstellen. Es gibt keine Möglichkeit in PHP MD5 zu entschlüsseln.

1

MD5 ist eine Einwegfunktion. Sie können es nicht entschlüsseln. SO Sie benötigen eine Seite zum Zurücksetzen des Passworts.

1
Balanivash