我试图在php的同一服务器上创建一个登录系统,通过django创建注册。
我不知道django是如何加密密码的。我在数据库中看到的密码是这样的:
pbkdf2_sha256$10000$qlzlSSgHottd$5hV9BfLpzyAS62KZhvRyDBnagr1rYf29VbkZbfjipV4=
现在我想在PHP中创建一个登录系统,该系统使用上述散列指定的密码进行验证。所以请帮助我如何创建一个登录系统的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函数。
享受它。
与其在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
这个函数在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);
}
加密(至少对于密码)的全部意义在于,从理论上讲,从一些加密的数据返回到明文是非常困难的。然而,在这种情况下,数据似乎留下了如何加密的注释。它似乎使用了盐值为10000的SHA256。我不是django专家(或加密专家),但这似乎非常相关:django Passlib
所以无论你要实现什么,你只需要使用相同的加密方法。
文档应该可以帮助你
所以使用的算法是:pbkdf2 sha256& lt;算法> $ & lt;迭代> $ & lt; sal> $ & lt;散列>
默认情况下,Django使用SHA256哈希的PBKDF2算法