Документация Python неофициальный перевод

secrets.md

136 строк · 9.6 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.7/library/secrets.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`secrets`](https://python-all.ru/3.7/library/secrets.html#module-secrets) – Генерация защищённых случайных чисел для управления секретами89Новое в версии 3.6.1011**Исходный код:** [Lib/secrets.py](https://python-all.ru/src/3.7/Lib/secrets.py)1213---1415Модуль [`secrets`](https://python-all.ru/3.7/library/secrets.html#module-secrets) используется для генерации криптостойких случайных чисел, подходящих для управления такими данными, как пароли, аутентификация учётных записей, токены безопасности и связанные с ними секреты.1617В частности, [`secrets`](https://python-all.ru/3.7/library/secrets.html#module-secrets) следует использовать вместо стандартного генератора псевдослучайных чисел в модуле [`random`](https://python-all.ru/3.7/library/random.html#module-random), который предназначен для моделирования и симуляции, а не для безопасности или криптографии.1819> **См. также**20>21> [**PEP 506**](https://python-all.ru/3.7/library/secrets.html)2223## Случайные числа2425Модуль [`secrets`](https://python-all.ru/3.7/library/secrets.html#module-secrets) предоставляет доступ к самому безопасному источнику случайных данных, который есть в операционной системе.2627#### `class secrets.SystemRandom`2829Класс для генерации случайных чисел с использованием источников наивысшего качества, предоставляемых операционной системой. См. [`random.SystemRandom`](https://python-all.ru/3.7/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.7/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.7/library/secrets.html), токены должны обладать достаточной случайностью. К сожалению, то, что считается достаточным, со временем неизбежно возрастает, поскольку компьютеры становятся мощнее и способны перебирать больше вариантов за меньшее время. По состоянию на 2015 год считается, что 32 байта (256 бит) случайности достаточно для типичного варианта использования модуля [`secrets`](https://python-all.ru/3.7/library/secrets.html#module-secrets).7778Для тех, кто хочет управлять длиной токенов самостоятельно, можно явно указать количество случайности, используемой для токенов, передав аргумент [`int`](https://python-all.ru/3.7/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.7/library/secrets.html). См. [`hmac.compare_digest()`](https://python-all.ru/3.7/library/hmac.html#hmac.compare_digest) для получения дополнительных сведений.9192## Рецепты и рекомендации9394В этом разделе приведены рецепты и рекомендации по использованию [`secrets`](https://python-all.ru/3.7/library/secrets.html#module-secrets) для обеспечения базового уровня безопасности.9596Сгенерировать восьмисимвольный буквенно-цифровой пароль:9798```python99import string100alphabet = string.ascii_letters + string.digits101password = ''.join(choice(alphabet) for i in range(8))102```103104> **Примечание**105>106> Приложения не должны [хранить пароли в восстанавливаемом формате](https://python-all.ru/3.7/library/secrets.html), будь то в открытом виде или зашифрованными. Их следует снабжать солью и хешировать с использованием криптостойкой односторонней (необратимой) хеш-функции.107108Сгенерировать десятисимвольный буквенно-цифровой пароль, содержащий хотя бы одну строчную букву, хотя бы одну заглавную букву и хотя бы три цифры:109110```python111import string112alphabet = string.ascii_letters + string.digits113while True:114    password = ''.join(choice(alphabet) for i in range(10))115    if (any(c.islower() for c in password)116            and any(c.isupper() for c in password)117            and sum(c.isdigit() for c in password) >= 3):118        break119```120121Сгенерировать [кодовую фразу в стиле XKCD](https://python-all.ru/3.7/library/secrets.html):122123```python124# В стандартных системах Linux используйте подходящий файл словаря.125# На других платформах может потребоваться предоставить собственный список слов.126with open('/usr/share/dict/words') as f:127    words = [word.strip() for word in f]128    password = ' '.join(choice(words) for i in range(4))129```130131Сгенерировать труднопредсказуемый временный URL, содержащий защитный токен, подходящий для приложений восстановления пароля:132133```python134url = 'https://mydomain.com/reset=' + token_urlsafe()135```136