Хеширование паролей в Django отличается от библиотеки python passlib pbkdf2

Используя django администратора, я создал пользователя

email: cuteemail@example.com
password: ccpass!ccpass

Хешированный пароль, хранящийся в базе данных, равен

pbkdf2_sha256$260000$alGB1h2BRHwn83nz9fSJ3V$qippfbL8g59KPoDh+cIEh70TQCjuWeH8017VcLLpDIY=

Все, что я знаю, это то, что django генерирует хэш пароля, используя алгоритм PBKDF2.

Мне нужно запустить чистый скрипт на python, который внутри своей части проверяет, соответствует ли пароль хэшу. Я нашел библиотеку passlib. Я могу предоставить пароль и раунды. Но откуда берется соль для django?

from passlib.hash import pbkdf2_sha256

password = 'ccpass!ccpass'
db_hashed_password = 'pbkdf2_sha256$260000$alGB1h2BRHwn83nz9fSJ3V$qippfbL8g59KPoDh+cIEh70TQCjuWeH8017VcLLpDIY='

salt = db_hashed_password.split('$')[2].encode()
pbkdf2_sha256.hash(password, rounds=260000, salt=salt)

результат:

$pbkdf2-sha256$260000$YWxHQjFoMkJSSHduODNuejlmU0ozVg$qippfbL8g59KPoDh.cIEh70TQCjuWeH8017VcLLpDIY

Полученный хэш пароля выглядит одинаково, за исключением незначительных различий.

В pbkdf2-sha256 вместо знака подчеркивания стоит тире, но это не проблема. Я могу это исправить.

Основная проблема в том, что я получаю . вместо + в фактической части хэша. Как это исправить? Могу ли я слепо заменить все . на + ?

Я также не понимаю, почему рассчитанная соль отличается от исходной?

Я следовал django исходному коду.

Посмотрев на функцию encode и функцию pbkdf2, я могу написать следующий код:

import base64
import hashlib

myhash = base64.b64encode(hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 260000, None)).decode("ascii").strip()

print("%s$%d$%s$%s" % ('pbkdf2_sha256', 260000, salt.decode(), myhash))

Это даст мне тот же результат:

pbkdf2_sha256$260000$alGB1h2BRHwn83nz9fSJ3V$qippfbL8g59KPoDh+cIEh70TQCjuWeH8017VcLLpDIY=

.

Вернуться на верх