Сообщить об ошибке.

Генерация токенов модулем secrets в Python

Генерация безопасных токенов

Модуль secrets предоставляет функции для генерации безопасных токенов, которые подходят для таких приложений, как сброс пароля, трудно угадываемые URL-адреса и т. п.

Содержание:


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