secrets — Генерация криптографически стойких случайных чисел для работы с секретами
Добавлено в версии 3.6.
Исходный код: Lib/secrets.py
Модуль secrets используется для генерации криптографически стойких случайных чисел, подходящих для работы с такими данными, как пароли, аутентификация учетных записей, токены безопасности и другие подобные секреты.
В частности, secrets следует предпочесть используемому по умолчанию генератору псевдослучайных чисел из модуля random, который предназначен для моделирования и симуляции, а не для обеспечения безопасности или криптографии.
См. также
Случайные числа
Модуль secrets предоставляет доступ к наиболее безопасному источнику случайных чисел, доступному в вашей операционной системе.
-
class secrets.SystemRandom -
Класс для генерации случайных чисел с использованием самых качественных источников, предоставляемых операционной системой. Дополнительные сведения см. в описании
random.SystemRandom.
-
secrets.choice(seq) -
Возвращает случайно выбранный элемент непустой последовательности.
-
secrets.randbelow(exclusive_upper_bound) -
Возвращает случайное целое число из диапазона [0, exclusive_upper_bound).
-
secrets.randbits(k) -
Возвращает неотрицательное целое число с k случайными битами.
Генерация токенов
Модуль secrets предоставляет функции для генерации безопасных токенов, подходящих для таких задач, как сброс паролей, создание URL-адресов, которые трудно угадать, и тому подобного.
-
secrets.token_bytes(nbytes=None) -
Возвращает случайную байтовую строку, содержащую nbytes байт.
Если nbytes не указано или равно
None, вместо него используетсяDEFAULT_ENTROPY.>>> token_bytes(16) b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
-
secrets.token_hex(nbytes=None) -
Возвращает случайную текстовую строку в шестнадцатеричном формате. Строка содержит nbytes случайных байт, каждый из которых преобразуется в две шестнадцатеричные цифры.
Если nbytes не указано или равно
None, вместо него используетсяDEFAULT_ENTROPY.>>> token_hex(16) 'f9bf78b9a18ce6d46a0cd2b0b86df9da'
-
secrets.token_urlsafe(nbytes=None) -
Возвращает случайную текстовую строку, безопасную для URL и содержащую nbytes случайных байт. Текст кодируется в Base64, поэтому в среднем каждый байт преобразуется примерно в 1,3 символа.
Если nbytes не указано или равно
None, вместо него используетсяDEFAULT_ENTROPY.>>> token_urlsafe(16) 'Drmhze6EPcv0fN_81Bj-nA'
Сколько байт должны содержать токены?
Чтобы токены были защищены от атак методом перебора, они должны обладать достаточной случайностью. К сожалению, требования к достаточному уровню случайности неизбежно возрастают по мере того, как компьютеры становятся мощнее и могут проверять больше вариантов за меньшее время. По состоянию на 2015 год считается, что 32 байт (256 бит) случайных данных достаточно для типичных сценариев использования, предусмотренных для модуля secrets.
Если вы хотите самостоятельно управлять длиной токена, можно явно указать количество случайных данных для токенов, передав аргумент типа int различным функциям token_*. Этот аргумент задает количество используемых случайных байт.
В противном случае, если аргумент не указан или равен None, функции token_* используют DEFAULT_ENTROPY.
-
secrets.DEFAULT_ENTROPY -
Количество случайных байт по умолчанию, используемое функциями
token_*.Точное значение может измениться в любой момент, в том числе в выпусках с исправлениями.
Другие функции
-
secrets.compare_digest(a, b) -
Возвращает
True, если строки или объекты, подобные байтовым a и b равны, иFalseв противном случае. Для снижения риска атак по времени выполнения используется «сравнение за постоянное время». Дополнительные сведения см. в описанииhmac.compare_digest().
Примеры и рекомендации
В этом разделе приведены примеры и рекомендации по использованию secrets для обеспечения базового уровня безопасности.
Создание пароля из восьми буквенно-цифровых символов:
import string import secrets alphabet = string.ascii_letters + string.digits password = ''.join(secrets.choice(alphabet) for i in range(8))
Примечание
Приложения не должны хранить пароли в формате, допускающем восстановление, будь то открытый текст или зашифрованные данные. Пароли следует хешировать с солью с помощью криптографически стойкой односторонней (необратимой) хеш-функции.
Создание пароля из десяти буквенно-цифровых символов, содержащего как минимум одну строчную букву, одну заглавную букву и три цифры:
import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(secrets.choice(alphabet) for i in range(10))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3):
break
Создание парольной фразы в стиле XKCD:
import secrets
# On standard Linux systems, use a convenient dictionary file.
# Other platforms may need to provide their own word-list.
with open('/usr/share/dict/words') as f:
words = [word.strip() for word in f]
password = ' '.join(secrets.choice(words) for i in range(4))
Создание временного URL-адреса, который трудно угадать и который содержит токен безопасности, подходящий для приложений восстановления паролей:
import secrets url = 'https://example.com/reset=' + secrets.token_urlsafe()
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/secrets.html