Python Django ASP.NET身份密码有其等效项

ycggw6v2  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(131)

我 有 一 个 设置 任务 来 根据 . NET 身份 数据 库 验证 Django 应用 程序 用户 。 我 找到 了 许多 相关 的 主题 , 但 它们 要么 太 旧 , 要么 没有 解决 我 所 需要 的 - 密码 有 Django 的 等价 物 。

5q4ezhmt

5q4ezhmt1#

所以我最终学习了这个源代码https://github.com/aspnet/AspNetIdentity/blob/master/src/Microsoft.AspNet.Identity.Core/Crypto.cs,并且写了我的django版本。代码对我来说适用于django 2. 1. 1和.NET 4. 5

from django.contrib.auth.hashers import pbkdf2
import hashlib
from  base64 import b64decode

identity_PasswordHash = "AOOVvPns8Nov6CsJDTAWz+QDOEO2csh60m5aYyX2Vn7LsNDhiiZ5UaSDWr5izwWeHA=="
pwd_plain = 'Hellow123';

def dotnet_identity_check_password(password, hash):
    binsalt = b64decode(hash)[1:17]
    binpwd = b64decode(hash)[17:]
    genpwd = pbkdf2(password, binsalt, 1000, digest=hashlib.sha1, dklen=32)
    if genpwd == binpwd:
       return True
    return False

if dotnet_identity_check_password(pwd_plain,identity_PasswordHash):
     print("OK")
else:
     print("Fail")
oxcyiej7

oxcyiej72#

身份v3版本:

import hashlib
from  base64 import b64decode
def dotnet_identity_v3_check_password(password:str, hash:str)-> bool:
    bhash = b64decode(hash)
    iterCount = readNetworkByteOrder(bhash,5)
    saltSize = readNetworkByteOrder(bhash,9)
    if (saltSize < 128 / 8):
        return False    
    salt = bhash[13:13+saltSize]
    subkeySize = len(bhash) - 13 - saltSize
    if (subkeySize < 128 / 8):
        return False
    expectedSubkey = bhash[13+saltSize:]
    actualSubkey = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, iterCount, subkeySize)   
    if expectedSubkey == actualSubkey:
        return True
    return False
def readNetworkByteOrder( buffer: bytes, offset:int)->int:
    return ((buffer[offset]) << 24) | ((buffer[offset + 1]) << 16) | ((buffer[offset + 2]) << 8) | ((buffer[offset + 3]))

相关问题