Passlib – хэширование паролей

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Парольная безопасность — основа любой аутентификационной системы. Простое хранение паролей, даже с применением hashlib, уже давно не считается безопасным. Современные стандарты требуют адаптивных хэш-функций с солями, итерациями и защитой от атак по времени.

Passlib — это высокоуровневая Python-библиотека для безопасного хэширования паролей. Она поддерживает десятки алгоритмов, имеет единый API и широко используется в Flask, Django, FastAPI и кастомных системах авторизации. В этой статье — полный обзор возможностей, API, алгоритмов, и лучших практик Passlib.

Основная часть

Установка

pip install passlib

Для поддержки современных алгоритмов:

pip install passlib[bcrypt]

Общая архитектура

Passlib базируется на:

  • Унифицированном API (context)

  • Поддержке десятков алгоритмов (от md5_crypt до Argon2)

  • Адаптивности (итерации, соли)

  • Безопасности по умолчанию


Быстрый старт

from passlib.hash import pbkdf2_sha256

hash = pbkdf2_sha256.hash("mysecret")

pbkdf2_sha256.verify("mysecret", hash)  # True

Поддерживаемые алгоритмы

  • bcrypt

  • pbkdf2_sha256 / pbkdf2_sha512

  • argon2

  • sha256_crypt

  • sha512_crypt

  • md5_crypt (устарел)

Рекомендуемые: argon2, bcrypt, pbkdf2_sha256


Использование CryptContext

from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

hash = pwd_context.hash("password123")
pwd_context.verify("password123", hash)  # True

Обновление хэшей:

if pwd_context.needs_update(hash):
    hash = pwd_context.hash("password123")

Алгоритмы: примеры и параметры

bcrypt

from passlib.hash import bcrypt
bcrypt.using(rounds=12).hash("secret")

argon2

from passlib.hash import argon2
argon2.hash("mypassword")

Параметры: time_cost, memory_cost, parallelism

pbkdf2_sha256

from passlib.hash import pbkdf2_sha256
pbkdf2_sha256.using(rounds=200_000).hash("abc")

Работа с файлами пользователей

users = {"alice": pwd_context.hash("qwerty")}

if pwd_context.verify("qwerty", users["alice"]):
    print("Access granted")

Уровень безопасности

  • Passlib автоматически добавляет соль

  • Все алгоритмы устойчивы к атаке по словарю

  • Поддерживает “pepper” (дополнительный секрет)

  • Безопасная проверка (устойчива к атакам по времени)


Миграция хэшей

Если вы обновляете алгоритм:

pwd_context = CryptContext(schemes=["argon2", "bcrypt"], deprecated="auto")

Passlib автоматически определит старый формат и сможет пере-хэшировать.


Применение в фреймворках

  • Flask: через Flask-Security, Flask-Login

  • FastAPI: с OAuth2PasswordBearer + Passlib

  • Django: можно обернуть кастомные бекенды


Кейсы и практические применения

  • Веб-приложения и REST API

  • Системы авторизации CLI/IoT

  • Безопасное хранение master-паролей

  • Миграция с небезопасных алгоритмов

Полный список функций и свойств библиотеки passlib с описанием, сгруппированных по категориям


Создание и проверка хешей паролей

Функция Описание
hash = pwd_context.hash(password) Хеширует пароль с выбранным алгоритмом (по умолчанию bcrypt).
pwd_context.verify(password, hash) Проверяет, соответствует ли пароль указанному хешу.
pwd_context.needs_update(hash) Возвращает True, если хеш устарел и его стоит пересоздать.
pwd_context.identify(hash) Определяет, каким алгоритмом был создан хеш.
pwd_context.update(...) Обновляет параметры схемы (например, rounds).
pwd_context.to_string() Сериализует конфигурацию контекста в текст.
CryptContext.from_string(text) Восстанавливает контекст из строки (например, из файла).

Работа с конкретными алгоритмами

Функция Описание
bcrypt.hash(password) Создаёт bcrypt-хеш.
bcrypt.verify(password, hash) Проверяет пароль против bcrypt-хеша.
argon2.hash(password) Создаёт хеш с использованием Argon2.
argon2.verify(password, hash) Проверяет Argon2-хеш.
pbkdf2_sha256.hash(password) Создаёт PBKDF2-хеш с SHA256.
pbkdf2_sha256.verify(password, hash) Проверяет хеш PBKDF2.
scrypt.hash(password) Хеширование с использованием алгоритма scrypt.
scrypt.verify(password, hash) Проверка scrypt-хеша.
sha256_crypt.hash(password) Хеширует с помощью SHA256-CRYPT (Unix-совместимый формат).
sha256_crypt.verify(password, hash) Проверяет SHA256-CRYPT.

Управление контекстом (CryptContext)

Функция Описание
CryptContext(schemes=[...]) Создаёт контекст с поддержкой указанных схем (алгоритмов).
context.hash(password) Хеширует пароль с учётом выбранных настроек.
context.verify(password, hash) Проверяет пароль для любого поддерживаемого хеша.
context.policy Возвращает текущую политику контекста.
context.load_path(filepath) Загружает контекст из файла конфигурации.

Инструментальные функции и свойства

Функция Описание
passlib.utils.safe_str_cmp(a, b) Безопасное сравнение строк (устойчиво к тайминг-атакам).
passlib.registry.register_crypt_handler(...) Регистрирует свой собственный обработчик схемы.
passlib.context.lazy_crypt_context(...) Отложенное создание контекста (создаётся при первом использовании).
handler.using(...) Создаёт модифицированную версию хеш-функции с кастомными параметрами.

Основные алгоритмы, поддерживаемые Passlib (по умолчанию):

  • bcrypt

  • argon2

  • pbkdf2_sha256

  • sha256_crypt

  • scrypt

  • md5_crypt

  • des_crypt
    (и ещё более 30 других алгоритмов, включая устаревшие и совместимые с системами Linux, LDAP, Solaris и др.)


Заключение

Passlib — универсальное решение для безопасного хэширования паролей в Python. Она обеспечивает простой синтаксис, высокий уровень безопасности и гибкость в выборе алгоритма. Благодаря поддержке современных стандартов и удобному API, Passlib должен быть стандартом де-факто для любой Python-аутентификации.