Встроенный модуль 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