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")
IDENTITYV3 VERSON:
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]))
import hashlib
import base64
from django.contrib.auth.hashers import BasePasswordHasher
class ASPNetPasswordHasher(BasePasswordHasher):
"""
Password hasher that can verify ASP.NET hashes using PBKDF2 with HMAC-SHA1, HMAC-SHA256, or HMAC-SHA512.
"""
algorithm = "aspnet_pbkdf2"
def verify(self, password, encoded):
hashed_password = encoded.split('$')[1]
bhash = base64.b64decode(hashed_password)
prf = self.readNetworkByteOrder(bhash, 1)
iterations = self.readNetworkByteOrder(bhash, 5)
saltSize = self.readNetworkByteOrder(bhash, 9)
if prf == 0:
algorithm = 'sha1'
elif prf == 1:
algorithm = 'sha256'
elif prf == 2:
algorithm = 'sha512'
else:
return False
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(algorithm, password.encode('utf-8'), salt, iterations, subkeySize)
if expectedSubkey == actualSubkey:
return True
return False
def readNetworkByteOrder(self, buffer: bytes, offset:int)->int:
return ((buffer[offset]) << 24) | ((buffer[offset + 1]) << 16) | ((buffer[offset + 2]) << 8) | ((buffer[offset + 3]))