Skip to content

Instantly share code, notes, and snippets.

@skushnerchuk
Last active October 16, 2022 14:39
Show Gist options
  • Select an option

  • Save skushnerchuk/060b05fac1d350d7c4ab60db4d69f269 to your computer and use it in GitHub Desktop.

Select an option

Save skushnerchuk/060b05fac1d350d7c4ab60db4d69f269 to your computer and use it in GitHub Desktop.
def get_password_hash(password: str, salt: StrOrNone = None, rounds: int = 216000) -> str:
"""
Хеширование пароля.
Хеширование осуществляется так же как и в Django-варианте проекта,
чтобы не вынуждать пользователей сбрасывать пароли после миграции.
:param password: строка пароля
:param salt: строка соли
:param rounds: количество шагов
"""
salt = salt or token_hex(6)
# passlib генерирует хэш странным образом (ascii, заменяя + на .), преобразуем его
# в обычный base64, который использует Django
hash_obj = pbkdf2_sha256.using(salt=salt.encode(), rounds=rounds or 216000)
hash = hash_obj.hash(password)
parts = hash.split('$')[1:]
crc = ab64_decode(parts[3].encode())
# Так как passlib каждый раз генерирует новую соль, подставляем ту что передали мы
parts[2] = salt
parts[3] = base64.encodebytes(crc).decode().strip()
return '$'.join(parts)
def verify_password(password: str, saved_password: str) -> bool:
"""
Проверка корректности введенного пароля.
:param password: пароль
:param saved_password: хэш пароля из БД
"""
parts = saved_password.split('$')[1:]
password_hash = get_password_hash(password, parts[1], int(parts[0]))
return password_hash.split('$')[3:] == saved_password.split('$')[3:]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment