Модуль secrets
предоставляет функции для генерации безопасных токенов, которые подходят для таких приложений, как сброс пароля, трудно угадываемые URL-адреса и т. п.
secrets.token_bytes()
,secrets.token_hex()
,secrets.token_urlsafe()
.secrets.compare_digest()
.secrets.token_bytes([nbytes=None])
:Функция secrets.token_bytes()
возвращает случайную строку байтов, содержащую количество nbytes
байтов.
Если аргумент nbytes=None
или не указан, то по умолчанию используется разумное значение.
>>> import secrets >>> token_bytes(16) b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
secrets.token_hex([nbytes=None])
:Функция secrets.token_hex()
возвращает случайную текстовую строку в шестнадцатеричном формате. Строка содержит nbytes
случайных байтов, каждый байт преобразуется в две шестнадцатеричные цифры.
Если аргумент nbytes=None
или не указан, то по умолчанию используется разумное значение.
>>> import secrets >>> token_hex(16) 'f9bf78b9a18ce6d46a0cd2b0b86df9da'
secrets.token_urlsafe([nbytes=None])
:Функция secrets.token_urlsafe()
возвращает случайную URL-безопасную текстовую строку, содержащую nbytes
случайных байтов. Текст в кодировке Base64
, поэтому в среднем каждый байт дает примерно 1,3 символа.
Если аргумент nbytes=None
или не указан, то по умолчанию используется разумное значение.
>>> import secrets >>> token_urlsafe(16) 'Drmhze6EPcv0fN_81Bj-nA'
secrets.compare_digest(a, b)
:Функция secrets.token_urlsafe()
возвращает True
, если строки a
и b
равны, в противном случае False
, чтобы уменьшить риск "Атаки по времени".
Эта функция использует подход, разработанный для предотвращения анализа синхронизации путем исключения поведения короткого замыкания на основе содержимого, что делает её подходящим для криптографии. Аргументы a
и b
должны быть одного и того же типа, либо текстовыми строками, либо байтовыми строками.
>>> import secrets, hashlib # Вводимый пользователем пароль >>> input = 'passwd_secret' # Хеш пароля из базы данных >>> pwd_db = '95abda4e8f18a3c4e75214f0bc10e0a7968d5f22e42d127294c2af458eae537f' # получаем хеш вводимого пароля (конечно к нему должна подмешиваться 'соль') >>> pwd_input = hashlib.sha256(input.encode()).hexdigest() # И проводим безопасное сравнение с эталоном их базы >>> secrets.compare_digest(pwd_db, pwd_input) # True