我創建了一個頁面,它生成一個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並將其添加到登錄密碼中,然後對其進行散列並將其與存儲的散列密碼進行比較,該密碼應該是相同的? 所以我想知道我錯在哪裏,因爲我似乎無法弄清楚爲什麼哈希不匹配。
也許[你應該使用bcrypt用於存儲密碼(http://phpmaster.com/why-you-should-use-bcrypt-to-hash-stored-passwords/) –
所以你'存儲明文密碼**和**相同密碼的哈希值?你的思維過程很難遵循。 – Crontab
錯誤,你存儲了哪個哈希?你也錯過了將它放入調試輸出。請注意MySQL在列大小太小的情況下會自動截斷數據。 – hakre