Хеширование паролей в 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=
.