簡體   English   中英

使用完全相同的輸入散列密碼不會輸出相同的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM