1

我正在使用来加密我的用户密码。我正在使用 PHP,这里是用户注册过程中发生的事情的一个快速示例。

这里是:

PHP代码:

    // Gives me my random key. My salt generator.
    $salt = uniqid(mt_rand());

    // My password via what users inputs.
    $userpwd;

    // Then the encryption. I use a HMAC hash.
    $encrypted = hmac_hash("sha256", $userpwd, $salt);
?>

现在一切都在我的脚本中为我工作。但我的问题是,我如何验证用户登录?新的加密密码是随机的,所以我无法将登录表单中的密码与数据库中保存的加密密码进行比较。

我已经搜索并找不到解决方案。也许我搜索得不够努力,但是有没有办法解密密码?我可以做些什么来使用我的脚本对用户进行身份验证?

4

6 回答 6

8

您需要为每个用户的密码生成一个唯一的 salt,然后将 salt 的值存储在您可以检索到的地方。例如,通过将盐user与用户名和散列密码一起保存到表中。这样,您可以在对用户进行身份验证时提取已知的盐并通过您的函数运行它。

这是一篇包含更多信息的文章:存储密码 - 做得对!

有关盐的更多信息:salt-generation-and-open-source-software

于 2010-11-09T14:26:08.520 回答
3

您以相同的方式对用户输入的密码进行哈希处理,然后比较哈希是否与您存储的密码相同。

if (hmac_hash("sha256", $_POST['password'], $saltFromDatabase) === $hashFromDatabase)
    $login = true;

您还必须存储盐,因为每个用户的盐都不同。我还建议在整个应用程序中使用恒定的第二个盐(存储在硬配置文件中,这样即使数据库被破坏,密码仍然是安全的)。

注意:散列等于加密;这是一个不可逆的过程。

于 2010-11-09T14:24:52.937 回答
0

您不会解密您存储的内容。您对输入的密码进行哈希处理,并将其与注册时存储的密码进行比较。这是因为如果两个哈希值匹配(出于所有意图和目的),您可以确信源数据匹配。

于 2010-11-09T14:25:14.533 回答
0

您对用于登录的密码进行加密,并将其与数据库中的加密密码进行比较。:)

于 2010-11-09T14:26:09.457 回答
0

您计算用户输入的密码的哈希值,就像您在注册它们时所做的那样。请注意,该代码是半伪代码,您需要将其适应您的库或函数。

$res = db('SELECT etc FROM users WHERE user=? AND pass=?',
    $_POST['user'], hmac_hash("sha256", $_POST['pass'], $salt));
if(numRows($res) > 0) {
    // continue with authentication
}

如果盐存储在数据库中,那么您必须先获取它,或者在数据库中进行比较。

于 2010-11-09T14:28:33.067 回答
-2

你的盐需要是恒定的,而不是随机的。这样,当您根据哈希检查密码时,您所要做的就是再次使用盐对输入进行哈希处理,得到的哈希应该与之前的哈希相同。

于 2010-11-09T14:25:55.330 回答