2013-02-22 12 views
5

Mam problem z użyciem crypt(), gdzie jeśli użytkownik ma hasło (password1 w tym przykładzie) i zmieniają go na password2, hash zwraca ten sam wynik. Możesz przetestować to tutaj: OLD LINK Wpisz hasło1 jako aktualne hasło, a hasło2 jako nowe hasło i potwierdź hasło, zobaczysz wyniki. Jeśli wprowadzono całkowicie nie podobne hasło, nie ma problemu. Rozumiem, że istnieją inne sposoby radzenia sobie z hashami itp. Jestem bardziej ciekawy niż cokolwiek innego. Mój kod jest poniżej:Crypt zwraca tę samą mieszankę dla dwóch różnych (podobnych) haseł.

<?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

Jeśli korzystasz z bcrypt, pamiętaj, że maksymalna długość hasła to 55 znaków. Czy hasła próbują dłużej niż to? – Mike

+0

Nie w tym przykładzie. – dcclassics

+1

Który algorytm Crypt() jest używany? – TML

Odpowiedz

12

Aby użyć crypt musisz podać odpowiednią sól. Każdy algorytm ma swój własny format soli. Domyślam się, że używasz kilku losowych znaków jako soli, to nie pasuje do żadnego zaawansowanego algo, więc php redukuje twoją sól do pierwszych 2 znaków i fallbacks do podstawowego algorytmu DES. DES algorytm hashuje do 8 znaków i zarówno password1, jak i password2 ma 9 znaków długości, więc tylko password jest używany z obu, stąd ten sam skrót.

Rozwiązanie: użyć właściwego formatu sól do najsilniejszego dostępnego algorytmu generowania losowych sól do każdego hasła

Zalecane rozwiązanie: https://github.com/ircmaxell/password_compat (dla PHP 5.3.7 - wersji conajmniej 5.4.x) i po włączeniu do php 5.5: http://php.net/password_hash

Powiązane problemy