crypt.md
1> **Источник:** https://python-all.ru/3.11/library/crypt.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`crypt`](https://python-all.ru/3.11/library/crypt.html#module-crypt) – Функция для проверки паролей Unix89**Исходный код:** [Lib/crypt.py](https://python-all.ru/src/3.11/Lib/crypt.py)1011Устарело с версии 3.11, будет удалено в версии 3.13: Модуль [`crypt`](https://python-all.ru/3.11/library/crypt.html#module-crypt) устарел (см. [**PEP 594**](https://python-all.ru/3.11/library/crypt.html) для подробностей и альтернатив). Модуль [`hashlib`](https://python-all.ru/3.11/library/hashlib.html#module-hashlib) является потенциальной заменой для некоторых вариантов использования. Пакет [passlib](https://python-all.ru/3.11/library/crypt.html) может заменить все варианты использования этого модуля.1213---1415Этот модуль реализует интерфейс к функции *[crypt(3)](https://python-all.ru/3.11/library/crypt.html)*, которая представляет собой одностороннюю хеш-функцию, основанную на модифицированном алгоритме DES; подробнее см. в man-странице Unix. Возможные применения включают хранение хешированных паролей, чтобы можно было проверять пароли без хранения фактического пароля, или попытки взлома паролей Unix с помощью словаря.1617Обратите внимание, что поведение этого модуля зависит от фактической реализации функции *[crypt(3)](https://python-all.ru/3.11/library/crypt.html)* в работающей системе. Поэтому любые расширения, доступные в текущей реализации, также будут доступны в этом модуле.1819[Доступность](https://python-all.ru/3.11/library/intro.html#availability): Unix, не VxWorks.2021[Доступность](https://python-all.ru/3.11/library/intro.html#availability): not Emscripten, not WASI.2223Этот модуль не работает или недоступен на платформах WebAssembly `wasm32-emscripten` и `wasm32-wasi`. См. [платформы WebAssembly](https://python-all.ru/3.11/library/intro.html#wasm-availability) для получения дополнительной информации.2425## Методы хеширования2627Новое в версии 3.3.2829Модуль [`crypt`](https://python-all.ru/3.11/library/crypt.html#module-crypt) определяет список методов хеширования (не все методы доступны на всех платформах):3031#### `crypt.METHOD_SHA512`3233Метод формата Modular Crypt Format с солью из 16 символов и хешем из 86 символов, основанный на хеш-функции SHA-512. Это самый надежный метод.3435#### `crypt.METHOD_SHA256`3637Другой метод формата Modular Crypt Format с солью из 16 символов и хешем из 43 символов, основанный на хеш-функции SHA-256.3839#### `crypt.METHOD_BLOWFISH`4041Другой метод формата Modular Crypt Format с солью из 22 символов и хешем из 31 символа, основанный на шифре Blowfish.4243Добавлено в версии 3.7.4445#### `crypt.METHOD_MD5`4647Другой метод формата Modular Crypt Format с солью из 8 символов и хешем из 22 символов, основанный на хеш-функции MD5.4849#### `crypt.METHOD_CRYPT`5051Традиционный метод с солью из 2 символов и хешем из 13 символов. Это самый слабый метод.5253## Атрибуты модуля5455Новое в версии 3.3.5657#### `crypt.methods`5859Список доступных алгоритмов хеширования паролей в виде объектов `crypt.METHOD_*`. Этот список отсортирован от самого надежного к самому слабому.6061## Функции модуля6263Модуль [`crypt`](https://python-all.ru/3.11/library/crypt.html#module-crypt) определяет следующие функции:6465#### `crypt.crypt(word, salt=None)`6667Параметр *word* обычно представляет собой пароль пользователя, введенный в командной строке или в графическом интерфейсе. Необязательный параметр *salt* может быть строкой, возвращенной из [`mksalt()`](https://python-all.ru/3.11/library/crypt.html#crypt.mksalt), одним из значений `crypt.METHOD_*` (хотя не все могут быть доступны на всех платформах), или полным зашифрованным паролем, включающим соль, как возвращено этой функцией. Если *salt* не указан, будет использован самый надежный метод, доступный в [`methods`](https://python-all.ru/3.11/library/crypt.html#crypt.methods).6869Проверка пароля обычно выполняется путем передачи обычного текстового пароля в качестве *word* и полного результата предыдущего вызова [`crypt()`](https://python-all.ru/3.11/library/crypt.html#module-crypt), который должен совпадать с результатом данного вызова.7071*salt* (случайная строка из 2 или 16 символов, возможно, с префиксом `$digit$` для указания метода), которая будет использоваться для модификации алгоритма шифрования. Символы в *salt* должны принадлежать набору `[./a-zA-Z0-9]`, за исключением формата Modular Crypt Format, который добавляет префикс `$digit$`.7273Возвращает хешированный пароль в виде строки, состоящей из символов того же алфавита, что и соль.7475Поскольку некоторые расширения *[crypt(3)](https://python-all.ru/3.11/library/crypt.html)* допускают разные значения с разными размерами в *salt*, рекомендуется использовать полный зашифрованный пароль в качестве соли при проверке пароля.7677Изменено в версии 3.3: Принимает значения `crypt.METHOD_*` в дополнение к строкам для *salt*.7879#### `crypt.mksalt(method=None, *, rounds=None)`8081Возвращает случайно сгенерированную соль для указанного метода. Если *method* не указан, используется самый надежный метод, доступный в [`methods`](https://python-all.ru/3.11/library/crypt.html#crypt.methods).8283Возвращаемое значение – строка, подходящая для передачи в качестве аргумента *salt* в [`crypt()`](https://python-all.ru/3.11/library/crypt.html#module-crypt).8485*rounds* указывает количество раундов для `METHOD_SHA256`, `METHOD_SHA512` и `METHOD_BLOWFISH`. Для `METHOD_SHA256` и `METHOD_SHA512` это должно быть целое число между `1000` и `999_999_999`, по умолчанию `5000`. Для `METHOD_BLOWFISH` это должна быть степень двойки между `16` (24) и `2_147_483_648` (231), по умолчанию `4096` (212).8687Новое в версии 3.3.8889Изменено в версии 3.7: Добавлен параметр *rounds*.9091## Примеры9293Простой пример, иллюстрирующий типовое использование (сравнение за постоянное время необходимо для ограничения подверженности атакам по времени. [`hmac.compare_digest()`](https://python-all.ru/3.11/library/hmac.html#hmac.compare_digest) подходит для этой цели):9495```python96import pwd97import crypt98import getpass99from hmac import compare_digest as compare_hash100101def login():102 username = input('Python login: ')103 cryptedpasswd = pwd.getpwnam(username)[1]104 if cryptedpasswd:105 if cryptedpasswd == 'x' or cryptedpasswd == '*':106 raise ValueError('no support for shadow passwords')107 cleartext = getpass.getpass()108 return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd)109 else:110 return True111```112113Чтобы сгенерировать хеш пароля с помощью самого надёжного из доступных методов и проверить его с оригиналом:114115```python116import crypt117from hmac import compare_digest as compare_hash118119hashed = crypt.crypt(plaintext)120if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):121 raise ValueError("hashed version doesn't validate against original")122```123