在PHP中使用Django密码进行身份验证
我正在尝试在同一台服务器上用PHP创建一个登录系统,而这个系统的注册是通过Django来完成的。
我对Django是如何加密密码的完全不了解。现在我在数据库中看到的密码是这样的:
pbkdf2_sha256$10000$qlzlSSgHottd$5hV9BfLpzyAS62KZhvRyDBnagr1rYf29VbkZbfjipV4=
现在我想用PHP创建一个登录系统,来验证上面提到的加密密码。所以请帮我一下,告诉我如何为PHP创建一个登录系统。
注意:数据库已经设置好了,我有成千上万的用户在使用这个系统。我需要为我正在构建的另一个系统提供身份验证。
5 个回答
加密的主要目的(至少对于密码来说)是理论上很难从加密后的数据反推回原来的明文。不过,在这种情况下,数据似乎保留了它是如何加密的注释。看起来是用SHA256算法加上了10000的盐值进行加密的。我不是django专家(也不是加密专家),但这似乎很重要:Django Passlib
所以无论你在做什么,只需要使用相同的加密方法就可以了。
这个函数可以在 PHP 7.0 及以上版本中创建一个 Django 的哈希值。
function create(string $password, $iterations=36000, $algorithm='sha256', $iterations=36000) : string{
$salt = base64_encode(openssl_random_pseudo_bytes(9));
$hash = hash_pbkdf2($algorithm, $password, $salt, $iterations, 32, true);
return 'pbkdf2_' . $algorithm . '$' . $iterations . '$' . $salt . '$' . base64_encode($hash);
}
与其在PHP中重新创建哈希处理过程,不如让Django来帮你处理这个事情。
你可以使用这个脚本来从原始密码中获取哈希值:
django_password_hash.py:
import sys
from django.conf import settings
settings.configure()
from django.contrib.auth import hashers
raw_password = sys.argv[1]
try:
salt = sys.argv[2]
except IndexError:
salt = None
hash = hashers.make_password(raw_password, salt=salt)
sys.stdout.write("%s\n" % hash)
sys.stdout.flush()
sys.exit(0)
然后在PHP中调用它,像这样:
<?php
$password_hash = shell_exec('python /path/to/django_password_hash.py ' . $raw_password . ' ' . $salt);
// compare the value in $password_hash to database, etc...
// account for the "\n" at the end of $password_hash
别忘了查看这个链接,了解如何安全地执行命令:http://www.php.net/manual/en/function.escapeshellcmd.php
我遇到过和你一样的情况,Prateek。经过一些研究,下面的代码实现了我想要的功能,也正是你想要的。
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
function make_password($password) {
$algorithm = "pbkdf2_sha256";
$iterations = 10000;
$newSalt = mcrypt_create_iv(6, MCRYPT_DEV_URANDOM);
$newSalt = base64_encode($newSalt);
$hash = hash_pbkdf2("SHA256", $password, $newSalt, $iterations, 0, true);
$toDBStr = $algorithm ."$". $iterations ."$". $newSalt ."$". base64_encode($hash);
// This string is to be saved into DB, just like what Django generate.
echo $toDBStr;
}
function verify_Password($dbString, $password) {
$pieces = explode("$", $dbString);
$iterations = $pieces[1];
$salt = $pieces[2];
$old_hash = $pieces[3];
$hash = hash_pbkdf2("SHA256", $password, $salt, $iterations, 0, true);
$hash = base64_encode($hash);
if ($hash == $old_hash) {
// login ok.
return true;
}
else {
//login fail
return false;
}
}
?>
在make_password中生成的$toDBStr和你在这个帖子中发布的完全一样,你可以把这个字符串保存到任何数据库里,甚至可以继续使用Django创建的数据库。
你需要选择这个字符串,然后传递给verify_Password函数,以验证密码是否和用户输入的一样。
上面的PHP代码需要PHP 5.5版本才能使用hash_pbkdf2这个函数。
希望你喜欢。