2013-02-22 50 views
5

मुझे क्रिप्ट() का उपयोग करने में कोई समस्या है, जहां उपयोगकर्ता के पास पासवर्ड है (इस उदाहरण में पासवर्ड 1), और वे इसे पासवर्ड 2 में बदल देते हैं, हैशिंग एक ही परिणाम देता है। आप यहां परीक्षण कर सकते हैं: पुराना लिंक पासवर्ड 1 को वर्तमान पासवर्ड के रूप में टाइप करें, और पासवर्ड 2 को नया पासवर्ड और पासवर्ड की पुष्टि करें, तो आप परिणाम देखेंगे। यदि एक पूरी तरह से गैर समान पासवर्ड दर्ज किया गया है तो कोई समस्या नहीं है। मैं समझता हूं कि हैशिंग पासवर्ड आदि के बारे में जाने के अन्य तरीके हैं। मैं किसी भी चीज़ से ज्यादा उत्सुक हूं। मेरा कोड नीचे है:क्रिप्ट दो अलग-अलग (समान) पासवर्ड के लिए एक ही हैश लौट रहा है

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

यदि आप bcrypt का उपयोग कर रहे हैं, तो ध्यान रखें कि अधिकतम पासवर्ड लंबाई 55 वर्ण है। क्या आप इस पासवर्ड से अधिक समय तक कोशिश कर रहे हैं? – Mike

+0

इस उदाहरण में नहीं। – dcclassics

+1

आप किस क्रिप्ट() एल्गोरिदम का उपयोग कर रहे हैं? – TML

उत्तर

12

crypt का उपयोग करने के लिए आपको उचित नमक प्रदान करना होगा। प्रत्येक एल्गोरिदम का अपना नमक प्रारूप होता है। मेरा अनुमान है कि आप नमक के रूप में कुछ यादृच्छिक वर्णों का उपयोग कर रहे हैं, यह किसी भी उन्नत अहंकार से मेल नहीं खाता है, इसलिए PHP आपके नमक को पहले 2 वर्णों में गिरा देता है और मूल DES एल्गोरिदम पर फ़ॉलबैक करता है। DES एल्गोरिदम 8 अक्षरों तक है और password1 और password2 9 वर्ण लंबे हैं, इसलिए केवल password दोनों ही हैंश से उपयोग किया जाता है।

समाधान: सबसे मजबूत उपलब्ध एल्गोरिथ्म के लिए उचित नमक स्वरूप का उपयोग, प्रत्येक पासवर्ड के लिए यादृच्छिक नमक उत्पन्न

अनुशंसित समाधान: https://github.com/ircmaxell/password_compat (php 5.3.7 के लिए - 5.4.x) और स्विच करने के बाद PHP के लिए 5.5: http://php.net/password_hash