secrets.md
1> **Источник:** https://python-all.ru/3.9/library/secrets.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`secrets`](https://python-all.ru/3.9/library/secrets.html#module-secrets) – Генерация защищённых случайных чисел для управления секретами89Новое в версии 3.6.1011**Исходный код:** [Lib/secrets.py](https://python-all.ru/src/3.9/Lib/secrets.py)1213---1415Модуль [`secrets`](https://python-all.ru/3.9/library/secrets.html#module-secrets) используется для генерации криптостойких случайных чисел, подходящих для управления такими данными, как пароли, аутентификация учётных записей, токены безопасности и связанные с ними секреты.1617В частности, [`secrets`](https://python-all.ru/3.9/library/secrets.html#module-secrets) следует использовать вместо стандартного генератора псевдослучайных чисел из модуля [`random`](https://python-all.ru/3.9/library/random.html#module-random), который предназначен для моделирования и симуляции, а не для безопасности или криптографии.1819> **См. также**20>21> [**PEP 506**](https://python-all.ru/3.9/library/secrets.html)2223## Случайные числа2425Модуль [`secrets`](https://python-all.ru/3.9/library/secrets.html#module-secrets) предоставляет доступ к самому безопасному источнику случайных данных, который есть в операционной системе.2627#### `class secrets.SystemRandom`2829Класс для генерации случайных чисел с использованием источников наивысшего качества, предоставляемых операционной системой. См. [`random.SystemRandom`](https://python-all.ru/3.9/library/random.html#random.SystemRandom) для получения дополнительных сведений.3031#### `secrets.choice(sequence)`3233Возвращает случайно выбранный элемент из непустой последовательности.3435#### `secrets.randbelow(n)`3637Возвращает случайное целое число в диапазоне \[0, *n*).3839#### `secrets.randbits(k)`4041Возвращает целое число с *k* случайными битами.4243## Генерация токенов4445Модуль [`secrets`](https://python-all.ru/3.9/library/secrets.html#module-secrets) предоставляет функции для генерации защищённых токенов, подходящих для таких задач, как сброс паролей, создание URL-адресов, которые сложно угадать, и аналогичных.4647#### `secrets.token_bytes([nbytes=None])`4849Возвращает случайную байтовую строку, содержащую *nbytes* байт. Если *nbytes* – `None` или не указан, используется разумное значение по умолчанию.5051```pycon52>>> token_bytes(16) 53b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'54```5556#### `secrets.token_hex([nbytes=None])`5758Возвращает случайную текстовую строку в шестнадцатеричном формате. Строка содержит *nbytes* случайных байт, каждый байт преобразуется в две шестнадцатеричные цифры. Если *nbytes* – `None` или не указан, используется разумное значение по умолчанию.5960```pycon61>>> token_hex(16) 62'f9bf78b9a18ce6d46a0cd2b0b86df9da'63```6465#### `secrets.token_urlsafe([nbytes=None])`6667Возвращает случайную URL-безопасную текстовую строку, содержащую *nbytes* случайных байт. Текст кодируется в Base64, поэтому в среднем каждый байт даёт примерно 1.3 символа. Если *nbytes* – `None` или не указан, используется разумное значение по умолчанию.6869```pycon70>>> token_urlsafe(16) 71'Drmhze6EPcv0fN_81Bj-nA'72```7374### Сколько байтов должны использовать токены?7576Чтобы обеспечить защиту от [атак методом перебора](https://python-all.ru/3.9/library/secrets.html), токены должны обладать достаточной случайностью. К сожалению, то, что считается достаточным, со временем неизбежно возрастает, поскольку компьютеры становятся мощнее и способны перебирать больше вариантов за меньшее время. По состоянию на 2015 год считается, что 32 байта (256 бит) случайности достаточно для типичного варианта использования модуля [`secrets`](https://python-all.ru/3.9/library/secrets.html#module-secrets).7778Для тех, кто хочет управлять длиной токенов самостоятельно, можно явно указать количество случайности, используемой для токенов, передав аргумент [`int`](https://python-all.ru/3.9/library/functions.html#int) различным функциям `token_*`. Этот аргумент интерпретируется как количество байтов случайности.7980В противном случае, если аргумент не передан или равен `None`, функции `token_*` используют вместо него разумное значение по умолчанию.8182> **Примечание**83>84> Это значение по умолчанию может измениться в любой момент, в том числе во время выпусков с исправлениями.8586## Другие функции8788#### `secrets.compare_digest(a, b)`8990Возвращает `True`, если строки *a* и *b* равны, иначе `False`, таким образом, чтобы снизить риск [атак по времени](https://python-all.ru/3.9/library/secrets.html). См. [`hmac.compare_digest()`](https://python-all.ru/3.9/library/hmac.html#hmac.compare_digest) для получения дополнительных сведений.9192## Рецепты и рекомендации9394В этом разделе приведены рецепты и рекомендации по использованию [`secrets`](https://python-all.ru/3.9/library/secrets.html#module-secrets) для обеспечения базового уровня безопасности.9596Сгенерировать восьмисимвольный буквенно-цифровой пароль:9798```python99import string100import secrets101alphabet = string.ascii_letters + string.digits102password = ''.join(secrets.choice(alphabet) for i in range(8))103```104105> **Примечание**106>107> Приложения не должны [хранить пароли в восстанавливаемом формате](https://python-all.ru/3.9/library/secrets.html), будь то в открытом виде или зашифрованными. Их следует снабжать солью и хешировать с использованием криптостойкой односторонней (необратимой) хеш-функции.108109Сгенерировать десятисимвольный буквенно-цифровой пароль, содержащий хотя бы одну строчную букву, хотя бы одну заглавную букву и хотя бы три цифры:110111```python112import string113import secrets114alphabet = string.ascii_letters + string.digits115while True:116 password = ''.join(secrets.choice(alphabet) for i in range(10))117 if (any(c.islower() for c in password)118 and any(c.isupper() for c in password)119 and sum(c.isdigit() for c in password) >= 3):120 break121```122123Сгенерировать [кодовую фразу в стиле XKCD](https://python-all.ru/3.9/library/secrets.html):124125```python126import secrets127# В стандартных системах Linux используйте подходящий файл словаря.128# На других платформах может потребоваться предоставить собственный список слов.129with open('/usr/share/dict/words') as f:130 words = [word.strip() for word in f]131 password = ' '.join(secrets.choice(words) for i in range(4))132```133134Сгенерировать труднопредсказуемый временный URL, содержащий защитный токен, подходящий для приложений восстановления пароля:135136```python137import secrets138url = 'https://example.com/reset=' + secrets.token_urlsafe()139```140