2012-09-21 181 views
-1

我創建了一個頁面,它生成一個40個字符的鹽,然後獲取輸入的密碼並使用此PHP代碼創建一個哈希,並將salt和哈希密碼插入到數據庫中只是相關行):PHP鹽和哈希密碼不匹配

$hashedpassword = sha1($password . $salt); 

然後在登錄過程中,我用的是輸入的密碼,並從數據庫中檢索鹽打造具有使用的代碼(再次同一直線上,這只是有關線):

$hashedpassword = sha1($storedPassword . $storedSalt); 

但它不符合散列密碼存儲,所以要看看是否有錯誤,我「遙相呼應」的信息,所以我可以閱讀發生了什麼事:

$storedSalt = $row_rsSaltLookup['salt']; 
$storedPassword = $row_rsSaltLookup['password']; 
$storedHashedPassword = $row_rsSaltLookup['hashedpassword']; 
    //use the stored salt to hash the user's submitted password 
$hashedpassword = sha1($storedPassword . $storedSalt); 
echo "Salt: " . $storedSalt . "<br/>"; 
echo "Stored Password: " . $storedPassword . "<br/>"; 
echo "Stored Hashed Password: " . $storedHashedPassword . "<br/>"; 
echo "Pre-hash: " . $storedPassword . $storedSalt . "<br/>"; 
echo "Hashed Password: " . $hashedpassword . "<br/>"; 
echo "re-Hashed Password: " . sha1($storedPassword . $storedSalt) . "<br/>"; 
echo "re-Hashed Password 2: " . sha1($storedPassword . $storedSalt) . "<br/>"; 
if($storedHashedPassword != $hashedpassword) { 
    echo "NO MATCH"; 
}else{ 
    echo "MATCH"; 
} 
exit(); 

而且我得到這個結果:

Salt: 4039505cc4efae2 
Stored Password: ujwiervdhyf 
Stored Hashed Password: aa27c197dfd88cd2f0d46b84d259016a15bd3954 
Pre-hash: ujwiervdhyf4039505cc4efae2 
Hashed Password: b06193ed26617c449902ac813376cf0c33bec3d1 
re-Hashed Password: b06193ed26617c449902ac813376cf0c33bec3d1 
re-Hashed Password 2: b06193ed26617c449902ac813376cf0c33bec3d1 
NO MATCH 

在這個例子中,生成「鹽」並將其與創建和散列帳戶時的密碼(存儲密碼)放在一起(存儲散列密碼)。 當我登錄時,我從數據庫中獲取salt並將其添加到登錄密碼中,然後對其進行散列並將其與存儲的散列密碼進行比較,該密碼應該是相同的? 所以我想知道我錯在哪裏,因爲我似乎無法弄清楚爲什麼哈希不匹配。

+1

也許[你應該使用bcrypt用於存儲密碼(http://phpmaster.com/why-you-should-use-bcrypt-to-hash-stored-passwords/) –

+1

所以你'存儲明文密碼**和**相同密碼的哈希值?你的思維過程很難遵循。 – Crontab

+0

錯誤,你存儲了哪個哈希?你也錯過了將它放入調試輸出。請注意MySQL在列大小太小的情況下會自動截斷數據。 – hakre

回答

2

如果

$hashedpassword = sha1($storedPassword . $storedSalt); 
         ^^^^^^^^^^^^^^^ 

是第一次創建帳戶時所存儲的散列,那麼你這樣做是不對的。你在散列哈希,這是行不通的。它應該是

$hash_of_attempted_password = sha1($password_from_login_form . $storedSalt); 
if ($hash_of_attemped_password == $hash_of_original_password) { 
    ... it's a match ... 
} 
+0

第一個散列是使用表單中的密碼和生成的salt值創建的。鹽和原始密碼以及散列的密碼將被存儲(純文本字段將在稍後移除)。我比較登錄頁面上的密碼+存儲的salt和散列,以便將其與存儲的散列進行比較。這正是我在教程中閱讀的內容。我會檢查一下我的邏輯,以確保這正是我正在做的。 – stephmoreland