secrets — Генерация безопасных случайных чисел для управления секретами
Добавлен в версии 3.6.
Исходный код: Lib/secrets.py
Модуль secrets используется для генерации криптографически стойких случайных чисел, подходящих для управления данными, такими как пароли, аутентификация учетных записей, токены безопасности и связанные с ними секреты.
В частности, secrets следует использовать вместо генератора псевдослучайных чисел по умолчанию в модуле random, который предназначен для моделирования и имитации, а не для безопасности или криптографии.
См. также
Случайные числа
Модуль secrets предоставляет доступ к наиболее безопасному источнику случайности, предоставляемому вашей операционной системой.
-
class secrets.SystemRandom -
Класс для генерации случайных чисел, используя источники наивысшего качества, предоставляемые операционной системой. См.
random.SystemRandomдля получения дополнительных сведений.
-
secrets.choice(seq) -
Возвращает случайный элемент из непустого последовательности.
-
secrets.randbelow(exclusive_upper_bound) -
Возвращает случайное целое число в диапазоне [0, верхняя_граница_исключая).
-
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если строки или байтовые объекты 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/secrets.html