2012-02-25 110 views
0

我正在使用phpass的bcrypt功能在我的網站上查找密碼。 現在,它不會真的有效。試圖與CheckPassword函數進行比較將不起作用。我對通過我用來解密哈希的每個函數發出的每個字符串進行了大量調試,並得出結論:由bcrypt生成的哈希值非常隨機。所以,新生成的明文密碼的哈希將永遠不會匹配我的數據庫中的密碼。真的嗎?如果是這樣,我該如何讓它工作?源代碼相當簡單。使用bcrypt獲取用戶密碼

// when creating user 
<db insert code>$hash->HashPassword($_POST['password']); 

// when logging in 
return $hash->CheckPassword($user->password, $_POST['password']); 
+0

這兩行代碼是否在同一臺服務器上運行?如果您的服務器的PHP配置中無法使用phpass,phpass會自動降級(即不實際使用bcrypt)。 – 2012-02-25 16:24:49

回答

1

編輯: 問題是你有順序不對,你所需要的密碼,然後存儲的哈希值。

$check = $hasher->CheckPassword($password, $stored_hash); 

Source

這個問題,因爲我之前說的(下)存儲的哈希來決定如何散列密碼進行比較,從而你的不對了參數順序會導致失敗。從之前

答:

你不解密的哈希,您可以通過相同的方式散列可比數據進行檢查。 BCrypt哈希包括哈希,鹽和輪次數,所以在檢查時應該沒有問題。

哈希從不相同的原因是鹽每次都會有所不同。這是爲了防止彩虹表攻擊。

據我所知,你的支票是健全的。問題必須在別處。你確定$user->password實際上包含完整的哈希值嗎? BCrypt哈希是60個字符,因此請確保它不被截斷。

+0

是的我知道我不解密,我只是用這個詞沒有很好的理由哈哈。是的,我檢查了存儲的散列並沒有問題。在使用'CheckPassword'時查看結果散列,它顯示比較散列從不相同,我想知道什麼是錯誤的,爲什麼它不會返回一個'true'布爾值。 – casraf 2012-02-25 16:15:53

+0

更新了答案,你的''CheckPassword''的參數順序錯誤。 – 2012-02-25 16:21:59

+0

是的!現在工作。奇怪的是,示例文件顯示了相反的情況。顯然我誤解或誤解了變量在那裏的使用方式。 – casraf 2012-02-25 16:35:18