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или не указано, используется подходящее значение по умолчанию.>>> token_bytes(16) b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
-
secrets.token_hex([nbytes=None]) -
Возвращает случайную текстовую строку в шестнадцатеричном формате. Строка содержит nbytes случайных байт, каждый из которых преобразуется в две шестнадцатеричные цифры. Если nbytes равно
Noneили не указано, используется подходящее значение по умолчанию.>>> token_hex(16) 'f9bf78b9a18ce6d46a0cd2b0b86df9da'
-
secrets.token_urlsafe([nbytes=None]) -
Возвращает случайную текстовую строку, безопасную для URL и содержащую nbytes случайных байт. Текст кодируется в Base64, поэтому в среднем каждый байт преобразуется примерно в 1,3 символа. Если nbytes равно
Noneили не указано, используется подходящее значение по умолчанию.>>> token_urlsafe(16) 'Drmhze6EPcv0fN_81Bj-nA'
Сколько байт должно быть в токенах?
Чтобы обеспечить защиту от атак методом перебора, токены должны содержать достаточно случайных данных. К сожалению, необходимое количество случайных данных неизбежно будет расти по мере увеличения вычислительной мощности компьютеров и числа попыток, которые можно выполнить за более короткое время. По состоянию на 2015 год считается, что 32 байт (256 бит) случайных данных достаточно для типичных случаев использования модуля secrets.
Если вы хотите самостоятельно управлять длиной токена, можно явно указать объем случайных данных, используемых для токенов, передав аргумент типа int различным функциям token_*. Значение этого аргумента задает количество байт случайных данных.
Если аргумент не указан или равен None, функции token_* будут использовать подходящее значение по умолчанию.
Примечание
Значение по умолчанию может измениться в любое время, в том числе в выпусках с исправлениями.
Другие функции
-
secrets.compare_digest(a, b) -
Возвращает
True, если строки или объекты, подобные bytes 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–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/secrets.html