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

crypt.md

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

1> **Источник:** https://python-all.ru/3.6/library/crypt.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 35.5. [`crypt`](https://python-all.ru/3.6/library/crypt.html#module-crypt)– Функция для проверки паролей Unix89**Исходный код:** [Lib/crypt.py](https://python-all.ru/src/3.6/Lib/crypt.py)1011---1213Этот модуль реализует интерфейс к *crypt(3)*, которая является односторонней хэш-функцией на основе модифицированного алгоритма DES; за дополнительными сведениями обратитесь к man-странице Unix. Возможные применения включают хранение хэшированных паролей, чтобы можно было проверять пароли без хранения фактического пароля, или попытку взлома паролей Unix с помощью словаря.1415Обратите внимание, что поведение этого модуля зависит от фактической реализации *crypt(3)* в работающей системе. Поэтому все расширения, доступные в текущей реализации, будут доступны и в этом модуле.1617## 35.5.1. Методы хеширования1819Новое в версии 3.3.2021Модуль [`crypt`](https://python-all.ru/3.6/library/crypt.html#module-crypt) определяет список методов хеширования (не все методы доступны на всех платформах):2223#### `crypt.METHOD_SHA512`2425Метод Modular Crypt Format с 16-символьной солью и 86-символьным хешем. Это самый надёжный метод.2627#### `crypt.METHOD_SHA256`2829Ещё один метод Modular Crypt Format с 16-символьной солью и 43-символьным хешем.3031#### `crypt.METHOD_MD5`3233Ещё один метод Modular Crypt Format с 8-символьной солью и 22-символьным хешем.3435#### `crypt.METHOD_CRYPT`3637Традиционный метод с солью из 2 символов и хешем из 13 символов. Это самый слабый метод.3839## 35.5.2. Атрибуты модуля4041Новое в версии 3.3.4243#### `crypt.methods`4445Список доступных алгоритмов хеширования паролей в виде объектов `crypt.METHOD_*`. Этот список отсортирован от самого надежного к самому слабому.4647## 35.5.3. Функции модуля4849Модуль [`crypt`](https://python-all.ru/3.6/library/crypt.html#module-crypt) определяет следующие функции:5051#### `crypt.crypt(word, salt=None)`5253*word* обычно содержит пароль пользователя, введённый в приглашении или в графическом интерфейсе. Необязательный *salt* – это либо строка, возвращаемая из [`mksalt()`](https://python-all.ru/3.6/library/crypt.html#crypt.mksalt), одно из значений `crypt.METHOD_*` (хотя не все могут быть доступны на всех платформах), либо полный зашифрованный пароль, включающий соль, как возвращается этой функцией. Если *salt* не указан, будет использован самый надёжный метод (как возвращается [`methods()`](https://python-all.ru/3.6/library/crypt.html#crypt.methods)).5455Проверка пароля обычно выполняется путем передачи обычного текстового пароля в качестве *word* и полного результата предыдущего вызова [`crypt()`](https://python-all.ru/3.6/library/crypt.html#module-crypt), который должен совпадать с результатом данного вызова.5657*salt* (случайная строка из 2 или 16 символов, возможно, с префиксом `$digit$` для указания метода), которая будет использоваться для модификации алгоритма шифрования. Символы в *salt* должны принадлежать набору `[./a-zA-Z0-9]`, за исключением формата Modular Crypt Format, который добавляет префикс `$digit$`.5859Возвращает хешированный пароль в виде строки, состоящей из символов того же алфавита, что и соль.6061Поскольку некоторые расширения *crypt(3)* допускают различные значения с разными размерами *salt*, рекомендуется использовать полный зашифрованный пароль в качестве соли при проверке пароля.6263Изменено в версии 3.3: Принимает значения `crypt.METHOD_*` в дополнение к строкам для *salt*.6465#### `crypt.mksalt(method=None)`6667Возвращает случайно сгенерированную соль указанного метода. Если *method* не задан, используется самый надёжный метод из доступных (как возвращается [`methods()`](https://python-all.ru/3.6/library/crypt.html#crypt.methods)).6869Возвращаемое значение – строка длиной 2 символа для `crypt.METHOD_CRYPT`, или 19 символов, начинающаяся с `$digit$` и 16 случайных символов из набора `[./a-zA-Z0-9]`, подходящая для передачи в качестве аргумента *salt* в [`crypt()`](https://python-all.ru/3.6/library/crypt.html#module-crypt).7071Новое в версии 3.3.7273## 35.5.4. Примеры7475Простой пример, иллюстрирующий типовое использование (сравнение за постоянное время необходимо для ограничения подверженности атакам по времени. [`hmac.compare_digest()`](https://python-all.ru/3.6/library/hmac.html#hmac.compare_digest) подходит для этой цели):7677```python78import pwd79import crypt80import getpass81from hmac import compare_digest as compare_hash8283def login():84    username = input('Python login: ')85    cryptedpasswd = pwd.getpwnam(username)[1]86    if cryptedpasswd:87        if cryptedpasswd == 'x' or cryptedpasswd == '*':88            raise ValueError('no support for shadow passwords')89        cleartext = getpass.getpass()90        return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd)91    else:92        return True93```9495Чтобы сгенерировать хеш пароля с помощью самого надёжного из доступных методов и проверить его с оригиналом:9697```python98import crypt99from hmac import compare_digest as compare_hash100101hashed = crypt.crypt(plaintext)102if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):103    raise ValueError("hashed version doesn't validate against original")104```105