-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsecret.py
41 lines (33 loc) · 2.52 KB
/
secret.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import hashlib
import secrets
from typing import TypeAlias
# Строка, представляющая собой открытое значение текста (или секрета).
PlainStr: TypeAlias = str
# Строка, представляющая собой хэш-значение некоторого открытого текста (или секрета).
HashStr: TypeAlias = str
def generate_secret_string(size: int = 32) -> PlainStr:
"""
Генерирует секретную последовательность символов необходимого размера,
состоящую из псевдослучайных URL-safe-символов.
:param size: Длина необходимого секрета.
"""
return secrets.token_urlsafe(nbytes=size)[:size]
def make_hash(plain_text: PlainStr, encoding="ascii", hash_func=hashlib.sha256) -> HashStr:
"""
Вычисление хэша открытого текста.
:param plain_text: Открытый текст.
:param encoding: Кодировка для формирования хеша. По умолчанию используется ASCII, т.к. `secrets.token_urlsafe` использует её для генерации секрета.
:param hash_func: Функция хеширования из модуля `hashlib`. По умолчанию используется `SHA-256`.
:return: Строковое представление полученного хеша.
"""
encoded_secret: bytes = plain_text.encode(encoding)
return hash_func(encoded_secret).hexdigest()
def is_valid_hash(provided_plain_text: PlainStr, original_hash_value: HashStr, hash_func=hashlib.sha256) -> bool:
"""
Проверка соответствия переданного открытого текста его хэш-значению.
:param provided_plain_text: Представленный открытый текст для проверки.
:param original_hash_value: Строковое значение исходного хэша. Может быть получено функцией `make_hash`.
:param hash_func: Функция хеширования из модуля `hashlib`. По умолчанию используется `SHA-256`.
:return: `True`, если вычисленный хэш открытого текста совпал с исходным, `False` - в противном случае.
"""
return make_hash(provided_plain_text, hash_func=hash_func) == original_hash_value