2013-02-22 21 views
5

Bir kullanıcının bir parolası (bu örnekte parola1) varsa ve parola2 olarak değiştirirse, hashing aynı sonucu döndürür. Bunu şu şekilde test edebilirsiniz: OLD LINK Parolanızı 1 geçerli parola olarak ve parolayı2 yeni parola olarak yazın ve parolayı onaylayın, sonuçları göreceksiniz. Tamamen benzer olmayan bir şifre girilirse sorun olmaz. Anladığım kadarıyla şifreli şifrelerle uğraşmanın başka yolları da var. Benim kod aşağıda:Crypt iki farklı (benzer) parola için aynı kareyi döndürüyor

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

Eğer bcrypt kullanıyorsanız, maksimum şifre uzunluğunun 55 karakter olduğunu unutmayın. Bundan daha uzun denediğiniz şifreler mi? – Mike

+0

Bu örnekte değil. – dcclassics

+1

Hangi crypt() algoritmasını kullanıyorsunuz? – TML

cevap

12

Doğru tuzu sağlamak zorunda crypt kullanın. Her algoritmanın kendi tuz formatı vardır. Tahminimce, tuz gibi birkaç rasgele karakter kullanıyorsunuz, bu herhangi bir gelişmiş algo ile uyuşmuyor, bu yüzden php, ilk 2 karaktere kadar tuzunuzu düşürüyor ve temel DES algoritmasına geri dönüyor. DES 8 karaktere kadar algoritma karmaları ve hem password1 hem de password2, 9 karakter uzunluğundadır, bu nedenle her ikisinden de yalnızca password kullanılır.

Çözüm:

Önerilen çözüm, güçlü kullanılabilir algoritma için uygun bir tuzu biçimini kullanmak her şifre için rastgele bir tuzunu oluşturur: https://github.com/ircmaxell/password_compat (php 5.3.7 için - 5.4.x) ve açıldıktan sonra php 5.5: http://php.net/password_hash