簡體   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