2011-01-16 3 views
1

Ich habe einige Passwörter in meiner Datenbank verschlüsselt und ich möchte einen Weg finden, sie anzuzeigen. Hier ist, wie sie in meine MySQL-Datenbank gespeichert werden:Wie erstelle ich ein Passwort in meiner Datenbank? (PHP)

function generateHash($plainText, $salt = null){ 

       if ($salt === null) 
    { 
    $salt = substr(md5(uniqid(rand(), true)), 0, 25); 
    } 
    else 
    { 
    $salt = substr($salt, 0, 25); 
    } 

    return $salt . sha1($salt . $plainText); 
} 

     $secure_pass = generateHash($this->clean_password); 

Dann $ secure_pass ist in meiner Datenbank gespeichert.

Jeder hätte eine Idee ??

Vielen Dank;)

+2

Sie können eine Hash-Funktion im Allgemeinen nicht umkehren. – user359996

+0

Sie müssen den Unterschied zwischen Verschlüsselung und Hashing verstehen. – SLaks

+0

Warum beschränkst du dein Salz auf hexadezimale Zeichen? – SLaks

Antwort

9

Sie dürfen niemals ein Passwort anzeigen.
Sie dürfen niemals ein Passwort anzeigen.
Sie dürfen niemals ein Passwort anzeigen.

Der ganze Sinn des Hashing eines Passwortes ist es, dies unmöglich zu machen.

Da Sie eine etwas unsichere Hash verwenden, ist es ein bisschen weniger unmöglich, aber man kann es immer noch nicht.

Sie sollten SHA512 anstelle von SHA1 verwenden, um dies mehr unmöglich zu machen.

+0

+1 Ich denke, du hast es klar genug gemacht. :) – netcoder

+0

Es ist nicht der * ganze * Punkt. Der Rest des Punktes ist, dass man überprüfen kann, ob das Passwort (fast sicher) korrekt ist. – user359996

+1

@user: Das ist der Punkt des Speicherns des Passworts, nicht Hashing. – SLaks

3

Der Punkt eines kryptografischen Hash ist, dass es fast unmöglich ist, die Operation umzukehren. Also im Grunde ist die Antwort hier nein, das kannst du nicht.

+1

+1 ... du kannst nicht, und du solltest nicht. ;) – netcoder

0

Sie haben sie durch SHA1 laufen - die ursprünglichen Kennwörter werden zerstört und nicht wieder mit irgendwelchen praktischen Mittel. Sie könnten versuchen, eine andere Zeichenfolge zu finden, die die gleiche SHA1 erzeugt, aber das wäre mehr Aufwand, als es wert ist.

+0

Eigentlich ist das Passwort hashed (mit einem Salz) mit sha1 statt md5. Das Standard-Salz wird mit md5 –

+0

gehackt. Recht. Ich werde die Antwort reparieren. –

1

es eine unendliche Anzahl von Werten, die jede einzelne Hash produzieren werden, als solche gibt es keine Möglichkeit, mit Sicherheit das ursprüngliche Passwort zu reproduzieren, die gegeben wurde.

können Sie jedoch Passwörter anzeigen, indem Sie arbeiten eine der folgenden Methoden:

Cavet verwenden, um dies in einer angemessenen Höhe der Zeit vorgesehen, um die Anweisungen zu erteilen: Selbstverständlich, wenn Sicherheit für Sie wichtig ist, sollten Sie keine der oben genannten tun. Wenn Sie Benutzern erlauben möchten, die ihr Passwort vergessen haben, empfehle ich Ihnen, über das Zurücksetzen des Passworts zu lesen.

0

Sie können keine Hash-Funktion sooo Reverse ... Sie mit zwei Optionen links:

1 Force für Benutzer neues Passwort oder ...

2 Update der Hash als Benutzer einfügen Melden Sie sich erneut bei Ihrem System an (Sie können den Cookie und Sessions erzwingen, mit denen sich Benutzer anmelden können, ohne ihr Passwort erneut eingeben zu müssen). Diese Lösung ermöglicht es Ihren Benutzern, sich mit dem alten Hash einzuloggen und gleichzeitig den alten zu einem neuen zu aktualisieren. Wenn sich Ihr Benutzer das nächste Mal anmeldet, verwendet das Skript eine neue Hash-Version, um sich beim Benutzer anzumelden.

In diesem Beispiel habe ich MD5 als Hash verwendet, ich möchte auf BCRYPT mit Kosten = 12 aktualisieren, aber fühlen Sie sich frei, es zu ändern, was immer Sie brauchen. Änderung von BCRYPT Kosten = 10 zu BCRYPT Kosten = 12 würde auch funktionieren oder irgendeine andere Kombination. Betrachten Sie dieses Beispiel:

$passwordFromDatabase = "0d107d09f5bbe40cade3de5c71e9e9b7"; // md5 hash of "letmein" 
$passwordFromForm = $_POST['password']; // $_POST['password'] == "letmein" 

if(password_needs_rehash($passwordFromDatabase, PASSWORD_BCRYPT, ["cost" => 12]) && md5($passwordFromForm) === $passwordFromDatabase){ 
    // generate new password 
    $newPasswordHash = password_hash($passwordFromForm, PASSWORD_BCRYPT, ["cost" => 12]); 
    // update hash from databse - replace old hash $passwordFromDatabase with new hash $newPasswordHash 
    // after update login user 
    if(password_veryfi($passwordFromForm, $newPasswordHash)){ 
     // user has loged in successfuly and hash was updated 
     // redirect to user area 
    }else{ 
     // ups something went wrong Exception 
    } 
}else{ 
    if($password_veryfi($passwordFromForm, $passwordFromDatabase)){ 
     // user password hash from database is already BCRYPTed no need to rehash 
     // user has loged in successfuly 
     // redirect to user area 
    }else{ 
     // wrong password 
     // no access granted - stay where you are 
    } 
} 

Ich bevorzuge die Option seckound :). Treffen Sie Ihre eigene Wahl. Wenn Sie die Option seckound auswählen und wählen, dass Sie die Cookie-Sitzung nicht kicken, die dem Benutzer erlaubt, sich einzuloggen, ohne das Passwort anzugeben, ist es auch in Ordnung ... Die Änderung wird über die Zeit hinweg stattfinden. Und niemand wird die Veränderung bemerken.