Last active
October 16, 2022 14:39
-
-
Save skushnerchuk/060b05fac1d350d7c4ab60db4d69f269 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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