【问题标题】:Using django passwords in php for authentication在 php 中使用 django 密码进行身份验证
【发布时间】:2014-04-29 12:27:58
【问题描述】:

我正在尝试在 php 中在同一台服务器上创建一个登录系统,它通过 django 创建注册。

我不知道 django 是如何加密密码的。 我在数据库中看到的密码是这样的:

pbkdf2_sha256$10000$qlzlSSgHottd$5hV9BfLpzyAS62KZhvRyDBnagr1rYf29VbkZbfjipV4=

现在我想在 PHP 中创建一个登录系统,它使用上面的哈希指定密码进行验证。所以请帮我看看如何为PHP创建一个登录系统

注意:数据库已经建立,我有成千上万的用户正在使用它 我需要对正在构建的不同系统进行身份验证

【问题讨论】:

  • 您能否发布一个已知的明文密码和字符串哈希,以便验证假设的答案?
  • django 本身并没有对加密做任何神奇的事情,据我所知。您的问题是,“这是使用什么类型的加密?”,而不是“django 如何加密密码”。

标签: php python django encryption hash


【解决方案1】:

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

尽情享受吧。

【讨论】:

    【解决方案2】:

    您可能想让 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

    【讨论】:

    • 这似乎是合理的。但是生成的哈希每次都不一样。那么我将如何检查 raw_password 是否与之前已散列的散列值匹配
    • @PrateekChandan 没错,我忘了盐!所以我猜你必须从现有哈希中提取盐字符串,然后使用脚本(我已经更新它以将盐作为第二个参数)
    【解决方案3】:

    此函数在 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);
    }
    

    【讨论】:

    • 密钥是32, true);,位于hash_pbkdf2函数的末尾。
    【解决方案4】:

    加密的全部意义(至少对于密码而言)是,理论上,从某些加密数据返回到明文非常困难。但是,在这种情况下,数据似乎带有如何加密的注释。它似乎使用了盐为 10000 的 SHA256。我不是 django 专家(或加密专家),但这似乎非常相关:Django Passlib

    因此,无论您要实现什么,您只需要使用相同的加密方法即可。

    【讨论】:

      【解决方案5】:

      doc 应该可以帮助你

      $$$

      所以使用的算法是:pbkdf2 sha256

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

      【讨论】:

      • 这从对密码的理解上很明显
      • 我想知道如何在php中验证密码
      猜你喜欢
      • 2020-02-28
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多