[英]Hashing passwords with exact same inputs doesn't output the same value
如果您在我的網站上注冊,我正在嘗試哈希密碼,但它不起作用。 這是我在注冊時哈希密碼的代碼:
$escapedName = mysql_real_escape_string($_POST['user']);
$escapedPW = mysql_real_escape_string($_POST['password']);
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$hashedPW = hash('sha256', $escapedPW . $salt);
然后我只是將它插入數據庫(散列密碼和鹽)。 例如,當我使用以下salt散列Sas
時:
abac7ad23185ad19967f0d13e962197962782f0b7ec32d9889c27a93a9e800fa
這是哈希密碼:
8ca5c5f31fafbf382533dbcbfc22b3635d776ec7770c7eac58d8ef9f1fa3613c
但是當我嘗試在登錄時使用完全相同的密碼和salt來密碼密碼時,這將成為散列傳遞:
6eb4b16444f18cee19db32bd29a39970e3019c5b1972a982ae4cb9a59642dffc
這是我用來登錄的代碼:
$escapedName = mysql_real_escape_string($_POST['user']);
$escapedPW = mysql_real_escape_string($_POST['password']);
$saltQuery = mysql_query("SELECT salt FROM members WHERE user='{$escapedName}'");
while($result = mysql_fetch_assoc($saltQuery)) {
$salt = $result['salt'];
}
$hashedPW = hash('sha256', $escapedPW . $salt);
$sql = mysql_query("SELECT * FROM members WHERE user='$escapedName' AND pass='$hashedPW'; ");
while ($res = mysql_fetch_assoc($query2)) {
$username = $res['user'];
$PW = $res['pass'];
}
我希望代碼不是太多,我也希望你能理解我的問題。
抱歉,我無法發表評論,但有些事情告訴我,數據庫中的salt
列存在長度限制。
示例:鹽場可能只允許64個字符,而生成的鹽可能更長,因此當您保存鹽時,它會被修剪,最終會更改散列密碼。
如果是這種情況,您可能希望在保存之前修剪鹽。
我建議使用PDO對您的數據庫進行查詢。
由於某種原因,您對哈希函數的輸入必須不同。
在散列兩個用例(創建用戶和登錄名)之前,添加打印輸入的日志輸出消息。 還要確保在日志記錄中的輸入周圍加上引號以顯示空白問題。
在兩種情況下比較原始輸入以及散列函數的輸出,並且在某處會有差異。 如果沒有差異,並且哈希的輸出相同,那么查詢中的問題是在登錄案例中查找用戶。
無論你做什么,如果你想要哈希是相同的,那就不安全了! 有關正確的密碼哈希,請參見http://php.net/crypt 。
一切你需要的:
function check_password($password) {
...//get db password to compare
if (crypt($post_password, $db_results[0]['password']) == $db_results[0]['password']) {
return true;
} else { return false; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.