2013-07-07 105 views
-1

我正在使用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); 
+0

也許您正在使用來自數據庫的加密密碼作爲鹽?請參閱['crypt'](http://us1.php.net/manual/en/function.crypt.php) – Jon

+0

最好使用可信任的外部來源進行單向加密。一個我發現有用:https://github.com/SlayerSolutions/Authentication/blob/master/Downloads/Version%202%20%28Class%29.php或https://github.com/ircmaxell/PHP-PasswordLib –

+0

爲了給出一個有意義的答案,你需要知道hashed_pa​​ssword是如何進入db的,它是如何散列的?並且你知道它的crypt()實際上會散列currentPlaintext密碼的方式與你生成hashed_pa​​ssword的方式相同嗎? 因此,總結一下,關於如何處理哈希以提供有意義的答案,很少有信息 –

回答

0

您是否

crypt($plaintext, $pass) == $pass 

看着你看到地穴的第二個參數是$salt地穴手冊。所以你需要給它創建哈希時使用的salt。如果你不使用鹽(你應該這樣做),然後嘗試刪除第二個參數。

0

您確定您使用的是Sha512嗎?取決於系統,crypt()可能使用不同的算法。

0

PHP中crypt功能不一定返回的SHA512哈希值。

使用hash('sha512', $currentPlaintext)代替。