1

我对 php 比较陌生,并且刚刚开始掌握哈希密码的重点(我认为?)。无论如何,这是我的问题......

现在我有一个带有用户名、密码、盐字段的 mysql 数据库。密码字段长度为 64 个字符,盐字段长度为 3 个字符。在注册时,每个用户名都被分配一个随机盐。我对此没有任何问题(我相信)。首先,用户所需的密码通过以下方式进行哈希处理:

$hashedinput = hash ('sha256', $input);

然后通过以下过程使用 pbkdf2 中包含的 salt 对用户所需的密码进行哈希处理,并将其输入数据库:

$password = pbkdf2('sha256', $hashedinput, $salt, 10000, 64);

我的问题是登录。将数据库中的哈希密码与用户输入的密码进行比较时,它总是回来!=。这是我验证登录的方法:

$userData = mysql_fetch_array($search, MYSQL_ASSOC);
$inputhash = hash('sha256', $input); // From Form
$salt = $userData['salt']; // Salt from DB
$password = pbkdf2('sha256', $inputhash, $salt, 10000, 64);
$knownpassword = $userData['password']; // Known password from DB

所以,为了排除故障,我回显了所有输出,这就是我输入正确密码时的样子(它没有让我登录):

输入密码:3d8bc905668c1a1cca5b53a78941d3ca4673e12df6ac5e98e19fa47b153406f6e66913e43bf60478907ca07429b0cf90c808ce2097e0544cc44d298bfb7b85ad

数据库密码:3d8bc905668c1a1cca5b53a78941d3ca4673e12df6ac5e98e19fa47b153406f6

请注意,输入密码的前 64 个字符是正确的,但它会继续输入 128 个字符。DB密码只有64。

提前谢谢!

4

1 回答 1

1

Thomas Ptacek 不久前写了一篇很棒的文章,详细解释了盐是什么,为什么它有用,并给出了关于密码散列系统需要记住的 #1 规则:

使用别人的密码系统。不要建立自己的。

如果您打算在应用程序中使用 PHP 5.5,请使用新的password_hash API;如果不是,请确保您至少使用 PHP 5.3 并使用password_hash 用户空间兼容性库。它们旨在为您消除所有痛苦。

于 2013-02-12T04:44:19.663 回答