Spec-Zone.ru › Python 3.12

secrets — Генерация криптографически стойких случайных чисел для управления секретами

Добавлено в версии 3.6.

Исходный код: Lib/secrets.py

Модуль secrets используется для генерации криптографически стойких случайных чисел, подходящих для управления такими данными, как пароли, аутентификация учётных записей, токены безопасности и другие связанные секреты.

В частности, следует предпочитать secrets стандартному генератору псевдослучайных чисел из модуля random, который предназначен для моделирования и симуляции, а не для обеспечения безопасности или криптографии.

См. также

PEP 506

Случайные числа

Модуль 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, если строки или объекты, подобные байтам 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.12/library/secrets.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API