在PHP中使用Django密码进行身份验证

4 投票
5 回答
2904 浏览
提问于 2025-04-17 23:22

我正在尝试在同一台服务器上用PHP创建一个登录系统,而这个系统的注册是通过Django来完成的。

我对Django是如何加密密码的完全不了解。现在我在数据库中看到的密码是这样的:

pbkdf2_sha256$10000$qlzlSSgHottd$5hV9BfLpzyAS62KZhvRyDBnagr1rYf29VbkZbfjipV4=

现在我想用PHP创建一个登录系统,来验证上面提到的加密密码。所以请帮我一下,告诉我如何为PHP创建一个登录系统。

注意:数据库已经设置好了,我有成千上万的用户在使用这个系统。我需要为我正在构建的另一个系统提供身份验证。

5 个回答

0

加密的主要目的(至少对于密码来说)是理论上很难从加密后的数据反推回原来的明文。不过,在这种情况下,数据似乎保留了它是如何加密的注释。看起来是用SHA256算法加上了10000的盐值进行加密的。我不是django专家(也不是加密专家),但这似乎很重要:Django Passlib

所以无论你在做什么,只需要使用相同的加密方法就可以了。

0

这个文档应该能帮到你。

<算法>$<迭代次数>$<盐值>$<哈希值>

所以使用的算法是:pbkdf2 sha256。

默认情况下,Django使用PBKDF2算法,并结合SHA256哈希。

2

这个函数可以在 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);
}
4

与其在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

16

我遇到过和你一样的情况,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这个函数。

希望你喜欢。

撰写回答