2011-07-20 74 views
3

我試圖將mysql數據庫中的散列密碼值與登錄表單中輸入密碼的散列值進行比較。將散列值與散列mysql密碼進行比較(輸出值相等)

但是,當我比較兩個值時,表示它們不相等。我將鹽除去簡單,然後測試一下產出是,得到了相同的值

$password1 = $_POST['password']; 
$hash = hash('sha256', $password1); 
...connect to database, etc... 
$query = "SELECT * 
    FROM users 
    WHERE username = '$username1'"; 
$result = mysql_query($query); 
$userData = mysql_fetch_array($result); 
if($hash != $userData['password']) //incorrect password 
{ 
    echo $hash."|".$userData['password']; 
    die(); 
} 
...other code... 

輸出示例:

7816ee6a140526f02289471d87a7c4f9602d55c38303a0ba62dcd747a1f50361 | 7816ee6a140526f02289471d87a7c4f9602d55c38303a0ba62dcd747a1f50361

有什麼想法?

+0

您遇到的奇怪問題。 'var_dump($ hash)'和'var_dump($ userData ['password'])''的輸出是什麼? – Viktor

回答

0

嘗試使用strcmp。與==或!=進行的字符串比較很少順利。

if(strcmp($hash, $userData['password']) != 0) { 
    //this would be where the password was incorrect. 
} 

它可能很好地把它作爲一個數字出於某種原因,並沒有通過比較。

+0

剛剛嘗試過,沒有工作:( – Charlie

+0

這將是一個奇怪的,最後的努力,但嘗試用'mysql_fetch_array($ result,MYSQL_ASSOC)'替換'mysql_fetch_array($ result);''這真的不應該' t是你的麻煩的來源,但PHP是一個很奇怪的東西 – doctorless

+0

也沒有工作,我不明白,因爲輸出顯示完全相同的值,每次我測試 – Charlie

0

嘗試切換!=到==並切換內容。像這樣

if($hash == $userData['password']) //incorrect password 
{ 
    //proc login... 
} 
else 
{ 
    echo $hash."|".$userData['password']; 
    die(); 

} 

我不知道爲什麼會這樣發生,但可以肯定它會在我的情況下工作

編輯:你做錯了什麼,你的情況。 works for me

+0

我想不出它還能做什麼be。當我輸出這兩個值時,他們是相同的,試圖將訂單更改爲 – Charlie

+0

我不知道爲什麼會發生這種情況。您是否嘗試過我的第一個代碼? – genesis

+0

在單獨的文件中嘗試過您的代碼,然後執行我的登錄腳本與我的哈希值完全相同,它不工作 – Charlie

0

==是一個對象哈希碼比較,您需要使用strcmp函數來比較字符串文字。

+0

即使與if(strcmp($ hash,$ userData ['password'])== 0) – Charlie

0

不知道你是否得到了這個解決方案,但我只是浪費了30分鐘的完全相同的問題。結果發現我的mysql值在最後有一個額外的空間。這是一個測試用戶,我手動添加到數據庫,並在複製和粘貼哈希密碼時以某種方式獲得了額外的空間。

不知道這是否適用於您的情況,但我想我會分享。

3

我有完全相同的問題。 var_dump()告訴我,我有兩個變量具有相同的屬性,string(128)。我能夠得到比較結果的唯一方法就是將哈希值作爲字符串進行投射:

$password1 = $_POST['password']; 
$hash = (string)hash('sha256', $password1); 
... 
$userData = (string)mysql_fetch_array($result); 

if($hash == $userData) { 
    //This should return true. 
}