PHP盐和哈希密码不匹配

时间:2012-09-21 20:10:33

标签: php hash salt

我创建了一个生成40个字符的盐的页面,然后获取输入的密码并使用此PHP代码创建哈希,并使用盐和哈希密码将数据插入到数据库中(这只是相关的行):

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

然后在登录过程中,我使用输入的密码并从db中检索salt以使用相同的代码行创建has(再次,这只是相关的行):

$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”并将其与创建和散列帐户时使用的密码(存储密码)放在一起(存储的散列密码)。 当我登录时,我从数据库中获取salt并将其添加到登录密码,然后将其哈希并将其与存储的哈希密码进行比较,这应该是相同的? 所以我想知道我哪里出错了,因为我似乎无法弄清楚为什么哈希不匹配。

1 个答案:

答案 0 :(得分: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 ...
}
相关问题