我正在使用SHA-512來加密密碼。我認爲我正確地做了所有事情(甚至複製其他地方成功的代碼),但每次我嘗試輸入密碼時,都無法與我存儲在數據庫中的內容相匹配。無法驗證散列密碼
$sql = "SELECT hashed_password FROM Users WHERE user_name='$username'";
$result = mysql_query($sql);
$db_password = mysql_result($result, 0);
if (crypt($currentPlaintext, $db_password) != $db_password) {
echo "Your current password is incorrect.";
die();
}
我已經驗證了以下明顯的潛在問題,並消除他們的原因:
1)是存儲在我的數據庫加密口令
2)我能找回這個密碼其存儲在變量$ DB_PASSWORD
3)變量$ username和$ currentPlaintext確實有通過我的ajax函數調用經過正確的價值觀。
那麼,爲什麼不是這方面的工作?我錯過了明顯的東西嗎?謝謝!
編輯:謝謝你到目前爲止的意見。爲了澄清,據我所知的crypt()函數,crypt的第二個參數實際上是存儲在db中的整個字符串。該字符串不僅包含哈希密碼,還包含算法,鹽值和散列輪次數。 crypt()函數應該從該字符串中提取salt值,然後將其應用於散列第一個參數。然後將結果與以前散列的密碼進行比較。這就是爲什麼這是如此混亂。我不必給它一個鹽值 - 鹽在數據庫中。我誤解了這個函數發生了什麼?
我原本散列與此代碼的密碼:
$salt = uniqid();
$algo = '6';
$rounds = '5000';
$cryptSalt = '$' . $algo . '$rounds=' . $rounds . '$' . $salt;
$hashedPassword = crypt($plaintext, $cryptSalt);
也許您正在使用來自數據庫的加密密碼作爲鹽?請參閱['crypt'](http://us1.php.net/manual/en/function.crypt.php) – Jon
最好使用可信任的外部來源進行單向加密。一個我發現有用:https://github.com/SlayerSolutions/Authentication/blob/master/Downloads/Version%202%20%28Class%29.php或https://github.com/ircmaxell/PHP-PasswordLib –
爲了給出一個有意義的答案,你需要知道hashed_password是如何進入db的,它是如何散列的?並且你知道它的crypt()實際上會散列currentPlaintext密碼的方式與你生成hashed_password的方式相同嗎? 因此,總結一下,關於如何處理哈希以提供有意義的答案,很少有信息 –