3

我需要在 php.ini 中检查密码的有效性。密码在 django 中使用 pbkdf2 散列器进行散列,散列算法为 sha256。

https://gist.github.com/staydecent/1019680 <- 这个人可以用更简单的 sha1 哈希来做同样的事情。

在 Ruby on Rails 中验证 Django 密码会给出不匹配的密码 <- 这个人在 ruby​​ 中遇到了类似的问题,而不是 php。

据我了解,存储 django 密码时,哈希样式是第一个组件,其次是复制次数,然后是盐,然后是哈希。

我已经成功提取了每个组件,但是下面的 php 不起作用。它返回一个正确长度的字符串,但不是正确的内容。我担心哈希码不起作用。我使用的哈希器来自这个网站: https ://defuse.ca/php-pbkdf2.htm

这是我的 php:

//$enc_password is the password from database
$pieces = explode('$', $enc_password);
$iterations = $pieces[1];
$salt = $pieces[2];
$hash = $pieces[3];
//raw_password is user's entered password
if ($hash ==  base64_encode(pbkdf2("sha256", $raw_password, $salt, $iterations, 32, true)))
{
    echo ("SUCCESS");
}
else
{
    echo ("FAILED");
}

任何和所有的帮助表示赞赏!

4

1 回答 1

2

我刚刚在 Python 和 PHP 中做了一个简单的测试。

在 Python 中:

>>> from django.utils.crypto import pbkdf2
>>> import base64, hashlib
>>> hash = pbkdf2("test_password","myHash", 10000, 32, hashlib.sha256)
>>> hash.encode('base64').strip()
'lRKgL0zAmPwIMPNhTy1wJRXWZQwcHlbIW3glYA4LPU8='

在 PHP 中:

<?php
include 'pbkdf2.php';
echo base64_encode(pbkdf2('sha256', 'test_password', 'myHash', 10000, 32, true));
// result is: lRKgL0zAmPwIMPNhTy1wJRXWZQwcHlbIW3glYA4LPU8=
?>

两个测试的结果是相同的,所以哈希码没有问题。您确定您的 Django 测试使用的是 pbkdf2 算法吗?并且您的用户输入与测试密码相同?

于 2013-07-30T00:02:34.153 回答