基本的php pbkdf2哈希

时间:2013-02-12 04:39:49

标签: php hash salt pbkdf2

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

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

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

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

$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

因此,要排除故障我回显所有输出,这就是我输入CORRECT密码时的样子(并且它没有登录我):

输入密码:3d8bc905668c1a1cca5b53a78941d3ca4673e12df6ac5e98e19fa47b153406f6e66913e43bf60478907ca07429b0cf90c808ce2097e0544cc44d298bfb7b85ad

数据库密码:3d8bc905668c1a1cca5b53a78941d3ca4673e12df6ac5e98e19fa47b153406f6

请注意,输入密码的前64个字符是正确的,但它会继续保持128个字符的总和。数据库密码只有64。

提前致谢!

1 个答案:

答案 0 :(得分:1)

Thomas Ptacek wrote a great article一段时间后回答 - 详细说明 - 盐是什么,为什么它有用,并给出了关于密码散列系统需要记住的#1规则:

  

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

如果您要在应用程序中使用PHP 5.5,请使用新的password_hash API;如果你不是,请确保你至少使用PHP 5.3并使用password_hash userland compatability library。它们旨在为您带来所有的痛苦。