crypt.md
1> **Источник:** https://python-all.ru/3.3/library/crypt.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 34.5. [`crypt`](https://python-all.ru/3.3/library/crypt.html#module-crypt) – Функция для проверки паролей Unix89Этот модуль реализует интерфейс к *crypt(3)*, которая является односторонней хэш-функцией на основе модифицированного алгоритма DES; за дополнительными сведениями обратитесь к man-странице Unix. Возможные применения включают хранение хэшированных паролей, чтобы можно было проверять пароли без хранения фактического пароля, или попытку взлома паролей Unix с помощью словаря.1011Обратите внимание, что поведение этого модуля зависит от фактической реализации *crypt(3)* в работающей системе. Поэтому все расширения, доступные в текущей реализации, будут доступны и в этом модуле.1213## 34.5.1. Методы хеширования1415Новое в версии 3.3.1617Модуль [`crypt`](https://python-all.ru/3.3/library/crypt.html#module-crypt) определяет список методов хеширования (не все методы доступны на всех платформах):1819#### `crypt.METHOD_SHA512`2021Метод Modular Crypt Format с 16-символьной солью и 86-символьным хешем. Это самый надёжный метод.2223#### `crypt.METHOD_SHA256`2425Ещё один метод Modular Crypt Format с 16-символьной солью и 43-символьным хешем.2627#### `crypt.METHOD_MD5`2829Ещё один метод Modular Crypt Format с 8-символьной солью и 22-символьным хешем.3031#### `crypt.METHOD_CRYPT`3233Традиционный метод с солью из 2 символов и хешем из 13 символов. Это самый слабый метод.3435## 34.5.2. Атрибуты модуля3637Новое в версии 3.3.3839#### `crypt.methods`4041Список доступных алгоритмов хеширования паролей в виде объектов `crypt.METHOD_*`. Этот список отсортирован от самого стойкого к самому слабому и гарантированно содержит как минимум `crypt.METHOD_CRYPT`.4243## 34.5.3. Функции модуля4445Модуль [`crypt`](https://python-all.ru/3.3/library/crypt.html#module-crypt) определяет следующие функции:4647#### `crypt.crypt(word, salt=None)`4849Параметр *word* обычно содержит пароль пользователя, введённый в командной строке или в графическом интерфейсе. Необязательный параметр *salt* может быть строкой, возвращённой из [`mksalt()`](https://python-all.ru/3.3/library/crypt.html#crypt.mksalt), одним из значений `crypt.METHOD_*` (хотя не все могут быть доступны на всех платформах) или полным зашифрованным паролем, включающим соль, как возвращается этой функцией. Если *salt* не указан, будет использован самый стойкий метод (как возвращается [`methods()`](https://python-all.ru/3.3/library/crypt.html#crypt.methods)).5051Обычно проверка пароля выполняется путём передачи открытого пароля в качестве *word* и полного результата предыдущего вызова [`crypt()`](https://python-all.ru/3.3/library/crypt.html#module-crypt), который должен совпадать с результатом этого вызова.5253Параметр *salt* (случайная строка из 2 или 16 символов, возможно с префиксом `$digit$` для указания метода) используется для модификации алгоритма шифрования. Символы в *salt* должны принадлежать множеству `[./a-zA-Z0-9]`, за исключением Modular Crypt Format, который добавляет префикс `$digit$`.5455Возвращает хешированный пароль в виде строки, состоящей из символов того же алфавита, что и соль.5657Поскольку некоторые расширения *crypt(3)* допускают различные значения с разными размерами *salt*, рекомендуется использовать полный зашифрованный пароль в качестве соли при проверке пароля.5859Изменено в версии 3.3: Принимает значения `crypt.METHOD_*` в дополнение к строкам для параметра *salt*.6061#### `crypt.mksalt(method=None)`6263Возвращает случайно сгенерированную соль для указанного метода. Если параметр *method* не задан, используется самый стойкий из доступных методов, возвращаемый функцией [`methods()`](https://python-all.ru/3.3/library/crypt.html#crypt.methods).6465Возвращается строка: для `crypt.METHOD_CRYPT` длиной 2 символа, или 19 символов, начиная с `$digit$` и 16 случайных символов из множества `[./a-zA-Z0-9]`. Такая строка подходит для передачи в качестве аргумента *salt* в функцию [`crypt()`](https://python-all.ru/3.3/library/crypt.html#module-crypt).6667Новое в версии 3.3.6869## 34.5.4. Примеры7071Простой пример, иллюстрирующий типичное использование (требуется операция сравнения за константное время, чтобы ограничить подверженность атакам по времени. Для этой цели подходит [`hmac.compare_digest()`](https://python-all.ru/3.3/library/hmac.html#hmac.compare_digest)):7273```python74import pwd75import crypt76import getpass77from hmac import compare_digest as compare_hash7879def login():80 username = input('Python login: ')81 cryptedpasswd = pwd.getpwnam(username)[1]82 if cryptedpasswd:83 if cryptedpasswd == 'x' or cryptedpasswd == '*':84 raise ValueError('no support for shadow passwords')85 cleartext = getpass.getpass()86 return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd)87 else:88 return True89```9091Чтобы сгенерировать хеш пароля с помощью самого надёжного из доступных методов и проверить его с оригиналом:9293```python94import crypt95from hmac import compare_digest as compare_hash9697hashed = crypt.crypt(plaintext)98if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):99 raise ValueError("hashed version doesn't validate against original")100```101