Модуль secrets

Последнее обновление: 23.05.2025

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

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

Функциональность модуля делится на несколько аспектов, такие как генерация случайных чисел, генерация токенов и др. Рассмотрим эти аспекты.

Генерация случайных чисел

Для генерации случайных чисел модуль предоставляет ряд функций:

  • secrets.choice(seq): возвращает случайно выбранный элемент из непустой последовательности.

  • secrets.randbelow(exclusive_upper_bound): возвращает случайное целое число в диапазоне [0, exclusive_upper_bound].

  • secrets.randbits(k): возвращает неотрицательное целое число с k случайными битами.

Функцию secrets.choice() можно использовать, например, для генерации пароля с алфавитно-цифровыми символами. Например, сгенерируем пароль из 8 символов (алфавитно-цифровых):

import secrets
import string

characters = string.ascii_letters + string.digits
password = "".join(secrets.choice(characters) for i in range(8))

print(password)

Возможный вывод:

EZg7Xbou

Более сложный пример - сгенерируем восьмизначный пароль, содержащий как минимум одну строчную букву, как минимум одну заглавную букву, как минимум одну цифру и один символ пунктуации:

import secrets
import string

def generate_password(length=8):
    characters = string.ascii_letters + string.digits + string.punctuation
    while True:
        password = "".join(secrets.choice(characters) for _ in range(length))
        # Гарантируем наличие разных типов символов
        if (any(c.islower() for c in password)
                and any(c.isupper() for c in password)
                and any(c.isdigit() for c in password)
                and any(c in string.punctuation for c in password)):
            return password

print(generate_password())

Возможный вывод:

y-4!v?SR

Или сгенерируем восьмизначный буквенно-цифровой пароль, содержащий как минимум одну строчную букву, как минимум одну заглавную букву и как минимум три цифры:

import secrets
import string

def generate_password(length=8):
    characters = string.ascii_letters + string.digits
    while True:
        password = "".join(secrets.choice(characters) for _ in range(length))
        # Гарантируем наличие разных типов символов
        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):  # 3 цифры
                return password

print(generate_password())

Возможный вывод:

X9Y88vdi

Применение функции secrets.randbelow():

import secrets

# Генерация случайного числа в диапазоне
secure_number = secrets.randbelow(100)  # от 0 до 99
print(secure_number)

Применение функции secrets.randbits() для генерации числа с определенным количеством битов:

import secrets

number = secrets.randbits(7)    # из 7 битов
print(number)

Возможный вывод:

115

Генерация токенов

Для генерации защищенных токенов, подходящих для таких приложений, как сброс паролей, трудноугадываемые URL-адреса и др. модуль secrets предоставляет следуюшие функции:

  • secrets.token_bytes([nbytes=None]): возвращает случайную строку байтов, содержащую nbytes байтов. Если nbytes равно None или не указано, используется разумное значение по умолчанию.

  • secrets.token_hex([nbytes=None]): возвращает случайную текстовую строку в шестнадцатеричном формате. Строка содержит nbytes случайных байтов, каждый байт преобразован в две шестнадцатеричные цифры. Если nbytes равно None или не указано, используется разумное значение по умолчанию.

  • secrets.token_urlsafe([nbytes=None]): возвращает случайную текстовую строку, безопасную для URL, содержащую nbytes случайных байтов. Текст закодирован в Base64, поэтому в среднем каждый байт дает приблизительно 1,3 символа. Если nbytes равно None или не указано, используется разумное значение по умолчанию.

Применение функций

import secrets

# генерацию случайной строки байтов, содержащей nbytes количество байтов. 
token = secrets.token_bytes()
print(token)

#Если значение не указано, используется разумное значение по умолчанию
token = secrets.token_bytes(10)
print(token)

# Создание 16-байтового токена в шестнадцатеричном формате
token = secrets.token_hex(16)
print(token)

# Создание URL-безопасного токена
url_token = secrets.token_urlsafe(16)
print(url_token)

Возможный вывод:

b'\xae\xec\x153\xdf\xb8\x8d\xf4w\xb9\x81\xa0\x18o\xb2\x9f\x1aG\xa9F\x0c\x99\x19\xa1`8\xa2\xf4\xca\xb4m\xe3'
b"\xbdnC'`\xd5\x89^\xf2\x80"
ade45fc4d93547da769253467860bb1d
ShCFXRTCRHHsQQwoNTEFOg
Помощь сайту
Юмани:
410011174743222
Номер карты:
4048415020898850