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, используя «сравнение за постоянное время», чтобы снизить риск атак на время выполнения timing attacks. Дополнительные сведения см. в 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