繁体   English   中英

在php中使用django密码进行身份验证

[英]Using django passwords in php for authentication

我试图在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函数。

好好享受。

您可能希望让Django为您处理这个问题,而不是在PHP中重新创建散列过程。

使用此脚本从原始密码中获取哈希值:

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);
}

加密的整个要点(至少对于密码而言)是理论上很难从一些加密数据倒退到明文。 但是,在这种情况下,数据似乎留下了加密方式的注释。 它似乎使用了SHA256和10000的盐。我不是django专家(或加密专家),但这似乎非常相关: Django Passlib

因此,对于您正在实施的任何内容,您只需要使用相同的加密方法。

文档应该帮助你

<算法> $ <迭代> $ <SAL> $ <散列>

所以使用的算法是:pbkdf2 sha256

默认情况下,Django使用带有SHA256哈希的PBKDF2算法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM