Введение
Парольная безопасность — основа любой аутентификационной системы. Простое хранение паролей, даже с применением 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-аутентификации.