secrets — Генерация безопасных случайных чисел для управления секретами
Новая в версии 3.6.
Исходный код: Lib/secrets.py
Модуль secrets используется для генерации криптографически сильных случайных чисел, подходящих для управления данными, такими как пароли, аутентификация учетных записей, токены безопасности и связанные с ними секреты.
В частности, secrets следует использовать вместо стандартного псевдослучайного генератора в модуле random, который предназначен для моделирования и симуляции, а не для безопасности или криптографии.
См. также
15.3.1. Случайные числа
Модуль secrets предоставляет доступ к наиболее надежному источнику случайности, предоставляемому вашей операционной системой.
-
class secrets.SystemRandom -
Класс для генерации случайных чисел, используя источники наивысшего качества, предоставляемые операционной системой. Дополнительные сведения см. в
random.SystemRandom.
-
secrets.choice(sequence) -
Возвращает случайный элемент из непустого последовательности.
-
secrets.randbelow(n) -
Возвращает случайное целое число в диапазоне [0, n).
-
secrets.randbits(k) -
Возвращает целое число с k случайными битами.
15.3.2. Генерация токенов
Модуль 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'
15.3.2.1. Сколько байтов должны использовать токены?
Для обеспечения безопасности от атак методом перебора токен должен иметь достаточную случайность. К сожалению, то, что считается достаточным, неизбежно будет увеличиваться по мере того, как компьютеры становятся мощнее и могут совершать больше попыток за меньшее время. По состоянию на 2015 год считается, что 32 байта (256 бит) случайности достаточно для типичного использования модуля secrets.
Для тех, кто хочет управлять длиной токена самостоятельно, можно явно указать, сколько случайности использовать для токенов, указав аргумент int для различных функций token_*. Этот аргумент принимается как количество байтов случайности для использования.
В противном случае, если аргумент не указан или если аргумент None, функции token_* будут использовать разумное значение по умолчанию.
Примечание
Это значение по умолчанию может быть изменено в любое время, включая время релизов с исправлениями.
15.3.3. Другие функции
-
secrets.compare_digest(a, b) -
Возвращает
True, если строки a и b равны, в противном случаеFalse, таким образом, чтобы снизить риск атак с использованием временных различий. Дополнительные сведения см. вhmac.compare_digest().
15.3.4. Рецепты и рекомендации по практическому применению
В этом разделе представлены рецепты и рекомендации по практическому применению модуля secrets для обеспечения базового уровня безопасности.
Сгенерировать восьмисимвольный буквенно-цифровой пароль:
import string alphabet = string.ascii_letters + string.digits password = ''.join(choice(alphabet) for i in range(8))
Примечание
Приложения не должны хранить пароли в восстанавливаемом формате, будь то в виде обычного текста или зашифрованного. Они должны быть засолены и захешированы с использованием криптографически сильной односторонней (необратимой) функции хэширования.
Сгенерировать десятисимвольный буквенно-цифровой пароль с как минимум одной строчной буквой, как минимум одной заглавной буквой и как минимум тремя цифрами:
import string
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(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:
# 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(choice(words) for i in range(4))
Сгенерировать трудноугадываемый временный URL-адрес, содержащий токен безопасности, подходящий для приложений восстановления паролей:
url = 'https://mydomain.com/reset=' + token_urlsafe()
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/secrets.html