secrets — Генерация безопасных случайных чисел для управления секретами
Новое в версии 3.6.
Исходный код: Lib/secrets.py
Модуль secrets используется для генерации криптографически сильных случайных чисел, пригодных для управления данными, такими как пароли, аутентификация учетных записей, токены безопасности и связанные с ними секреты.
В частности, secrets следует использовать вместо генератора псевдослучайных чисел по умолчанию в модуле random, который предназначен для моделирования и симуляции, а не для обеспечения безопасности или криптографии.
См. также
Случайные числа
Модуль secrets предоставляет доступ к самому безопасному источнику случайности, предоставляемому вашей операционной системой.
-
class secrets.SystemRandom -
Класс для генерации случайных чисел с использованием источников наивысшего качества, предоставляемых операционной системой. Дополнительные сведения см. в
random.SystemRandom.
-
secrets.choice(sequence) -
Возвращает случайный элемент из непустого последовательности.
-
secrets.randbelow(n) -
Возвращает случайное целое число в диапазоне [0, n).
-
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 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.7/library/secrets.html