crypt
— Функція для перевірки паролів Unix¶
Вихідний код: Lib/crypt.py
Застаріло з версії 3.11, буде видалено у версії 3.13: The crypt
module is deprecated
(see PEP 594 for details and alternatives).
The hashlib
module is a potential replacement for certain use cases.
The passlib package can replace all use cases of this module.
Цей модуль реалізує інтерфейс до процедури crypt(3), яка є односторонньою хеш-функцією на основі модифікованого алгоритму DES; подробиці див. на сторінці довідки Unix. Можливе використання включає зберігання хешованих паролів, щоб ви могли перевіряти паролі, не зберігаючи справжній пароль, або спробу зламати паролі Unix за допомогою словника.
Зауважте, що поведінка цього модуля залежить від фактичної реалізації підпрограми crypt(3) у запущеній системі. Тому будь-які розширення, доступні для поточної реалізації, також будуть доступні в цьому модулі.
Availability: Unix, not VxWorks.
Availability: not Emscripten, not WASI.
This module does not work or is not available on WebAssembly platforms
wasm32-emscripten
and wasm32-wasi
. See
WebAssembly platforms for more information.
Методи хешування¶
Нове в версії 3.3.
Модуль crypt
визначає список методів хешування (не всі методи доступні на всіх платформах):
- crypt.METHOD_SHA512¶
Метод Modular Crypt Format із 16-символьним кодом і 86-символьним хешем на основі хеш-функції SHA-512. Це найсильніший метод.
- crypt.METHOD_SHA256¶
Інший метод Modular Crypt Format із 16-символьною сольовою і 43-символьною хеш-функцією на основі хеш-функції SHA-256.
- crypt.METHOD_BLOWFISH¶
Ще один метод Modular Crypt Format із 22 символами і хеш-кодом із 31 символу на основі шифру Blowfish.
Нове в версії 3.7.
- crypt.METHOD_MD5¶
Інший метод Modular Crypt Format із 8-символьною сольовою і 22-символьною хеш-функцією на основі хеш-функції MD5.
- crypt.METHOD_CRYPT¶
Традиційний метод із 2 символами солі та 13 символами хешу. Це найслабший метод.
Атрибути модуля¶
Нове в версії 3.3.
- crypt.methods¶
Список доступних алгоритмів хешування паролів у вигляді об’єктів
crypt.METHOD_*
. Цей список відсортовано від найсильнішого до найслабшого.
Функції модуля¶
Модуль crypt
визначає такі функції:
- crypt.crypt(word, salt=None)¶
word зазвичай буде паролем користувача, який вводиться під час запиту або в графічному інтерфейсі. Необов’язковий salt — це або рядок, отриманий від
mksalt()
, одне зі значеньcrypt.METHOD_*
(хоча не всі можуть бути доступні на всіх платформах), або повний зашифрований пароль, включаючи сіль , що повертається цією функцією. Якщо salt не вказано, буде використано найсильніший метод, доступний уmethods
.Перевірка пароля зазвичай здійснюється шляхом передачі простого текстового пароля як word і повних результатів попереднього виклику
crypt()
, які мають бути такими ж, як і результати цього виклику.salt (довільний рядок із 2 або 16 символів, можливо, із префіксом
$digit$
для вказівки методу), який використовуватиметься для порушення алгоритму шифрування. Символи в salt мають бути в наборі[./a-zA-Z0-9]
, за винятком Modular Crypt Format, який має префікс$digit$
.Повертає хешований пароль у вигляді рядка, який буде складатися із символів того самого алфавіту, що й сіль.
Оскільки кілька розширень crypt(3) допускають різні значення з різними розмірами salt, рекомендується використовувати повний зашифрований пароль як сіль під час перевірки пароля.
Змінено в версії 3.3: Приймайте значення
crypt.METHOD_*
на додаток до рядків для salt.
- crypt.mksalt(method=None, *, rounds=None)¶
Повертає випадково згенеровану сіль вказаного методу. Якщо method не вказано, використовується найсильніший метод, доступний у
methods
.Повернене значення — це рядок, який можна передати як аргумент salt до
crypt()
.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).Нове в версії 3.3.
Змінено в версії 3.7: Додано параметр rounds.
Приклади¶
Простий приклад, що ілюструє типове використання (операція порівняння в постійному часі необхідна для обмеження впливу часових атак. hmac.compare_digest()
підходить для цієї мети):
import pwd
import crypt
import getpass
from hmac import compare_digest as compare_hash
def login():
username = input('Python login: ')
cryptedpasswd = pwd.getpwnam(username)[1]
if cryptedpasswd:
if cryptedpasswd == 'x' or cryptedpasswd == '*':
raise ValueError('no support for shadow passwords')
cleartext = getpass.getpass()
return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd)
else:
return True
Щоб згенерувати хеш пароля за допомогою найнадійнішого доступного методу та порівняти його з оригіналом:
import crypt
from hmac import compare_digest as compare_hash
hashed = crypt.crypt(plaintext)
if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):
raise ValueError("hashed version doesn't validate against original")