如何在PHP中复制django密码验证函数


How do I replicate a django password validation function in PHP?

我需要在php中检查密码的有效性。密码在django中使用pbkdf2哈希器进行哈希处理,哈希算法为sha256。

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

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

据我所知,django密码是这样存储的,因此散列样式是第一个组件,接下来是复制次数,然后是salt,然后是散列。

我已经成功地提取了每个组件,但下面的php不起作用。它返回一个长度正确但内容不正确的字符串。我担心哈希代码不起作用。我使用的hasher来自这个网站: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");
}

感谢您的帮助!!

我刚刚用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算法吗?您的用户输入示例是否与测试密码相同?