2013-02-22 5 views
5

Ich habe ein Problem mit crypt(). Wenn ein Benutzer ein Passwort hat (password1 in diesem Beispiel), und sie es in password2 ändern, gibt das Hashing das gleiche Ergebnis zurück. Sie können das hier testen: OLD LINK Geben Sie password1 als aktuelles Passwort und password2 als neues Passwort und bestätigen Sie das Passwort, Sie werden die Ergebnisse sehen. Wenn ein vollständig nicht ähnliches Passwort eingegeben wird, gibt es kein Problem. Ich verstehe, dass es andere Wege gibt, Passwörter usw. zu haseln. Ich bin neugieriger als alles andere. Mein Code ist unten:Krypte, die denselben Hash für zwei verschiedene (ähnliche) Passwörter zurückgibt

<?php 

$oldpassword="password1"; 

echo "<form method=\"post\"> 
<p>Enter Current Password: <input type=\"password\" name=\"currentpassword\" /></p> 
<p>Enter New Password: <input type=\"password\" name=\"password\" /></p> 
<p>Confirm New Password: <input type=\"password\" name=\"confirmpassword\" /></p> 
<p><input type=\"submit\" value=\"Change Password\"></p> 
</form>"; 

$user_id = $_SESSION['user_id']; 
$pass=$_POST['password']; 
$salt = 'xxxxx'; 
$currentpassword = crypt($_POST['currentpassword'], $salt); 
$oldpassword = crypt($oldpassword, $salt); 
if(isset($_POST['password'])) { 
    if ($currentpassword !== $oldpassword) { 
     echo "The password you entered for current password does not match our records."; 
    } 
    else { 
     if ($_POST['password'] && $_POST['confirmpassword']) { 
      if ($_POST['password'] == $_POST['confirmpassword']) { 
      $hash = crypt($pass, $salt); 
       if ($hash == $currentpassword) { 
        echo "Current Password:&nbsp;"; 
        var_dump($_POST['currentpassword']); 
        echo "<br/>"; 
        echo "New Password:&nbsp;"; 
        var_dump($_POST['password']); 
        echo "<br/>"; 
        echo "New Hash:&nbsp"; 
        var_dump($hash); 
        echo "<br/>"; 
        echo "Current Password Hash:&nbsp"; 
        var_dump($currentpassword); 
        echo "<br/>"; 
        echo "<hr/>"; 
        echo "Your new password cannot be the same as your current password."; 
       } 
       else { 
        echo "Your password has been changed successfully<br/>"; 
       } 
      } else { 
       echo "Your passwords do not match. Please try again."; 
      } 
     } 
    } 
} 

?> 
+0

Wenn Sie bcrypt verwenden, beachten Sie, dass die maximale Passwortlänge 55 Zeichen beträgt. Sind die Passwörter, die Sie versuchen, länger als das? – Mike

+0

Nicht in diesem Beispiel. – dcclassics

+1

Welchen crypt() Algorithmus verwendest du? – TML

Antwort

12

verwenden crypt Sie die richtige Salz zur Verfügung stellen müssen. Jeder Algorithmus hat sein eigenes Salzformat. Meine Vermutung ist, dass Sie einige zufällige Zeichen als Salz verwenden, dies passt jedoch nicht zu einem fortgeschrittenen Algo, also reduziert php Ihr ​​Salz auf die ersten 2 Zeichen und Fallbacks auf den grundlegenden DES Algorithmus. DES Algorithmus Hashes bis zu 8 Zeichen und beide password1 und password2 sind 9 Zeichen lang, so nur password wird von beiden verwendet, daher gleichen Hash.

Lösung: richtiges Salz Format für stärksten verfügbaren Algorithmus verwenden, erzeugt zufälliges Salz für jedes Passwort

Empfohlene Lösung: https://github.com/ircmaxell/password_compat (für PHP 5.3.7 - 5.4.x) und nach dem Einschalten 5,5 bis PHP: http://php.net/password_hash