Введение
В эпоху постоянных утечек данных и атак на аутентификацию выбор надёжного алгоритма хэширования паролей — не вопрос предпочтения, а вопрос выживания проекта. Среди всех современных решений Argon2 признан лучшим алгоритмом хэширования паролей, победив в конкурсе Password Hashing Competition.
Библиотека argon2-cffi представляет собой официальную и активно поддерживаемую Python-обёртку над Argon2 через интерфейс CFFI. Она обеспечивает безопасное, устойчивое к атакам по времени и ресурсозатратное хэширование. В статье разберём полную архитектуру, методы, настройки, безопасность и примеры использования argon2-cffi.
Основная часть
Установка
pip install argon2-cffi
Поддерживаемые версии Argon2
-
Argon2i — защищён от атак по сторонним каналам, оптимален для хэширования паролей
-
Argon2d — устойчив к GPU-атакам, но менее защищён от сторонних каналов
-
Argon2id — гибридный режим, рекомендован по умолчанию (используется по умолчанию в argon2-cffi)
Быстрый старт
from argon2 import PasswordHasher
ph = PasswordHasher()
hash = ph.hash("секретный_пароль")
ph.verify(hash, "секретный_пароль") # True
Параметры PasswordHasher
PasswordHasher(
time_cost=2, # Сложность по времени (итерации)
memory_cost=102400, # Затраты памяти (в KB)
parallelism=8, # Потоков
hash_len=32, # Размер хэша в байтах
salt_len=16, # Длина соли
encoding="utf-8"
)
Валидация и обновление хэшей
try:
ph.verify(hash, "wrong_password")
except argon2.exceptions.VerifyMismatchError:
print("Неверный пароль")
Проверка необходимости обновления:
if ph.check_needs_rehash(hash):
new_hash = ph.hash("same_password")
Прямой доступ к низкоуровневым функциям
from argon2.low_level import hash_secret, Type
hash = hash_secret(
b"секрет", b"соль",
time_cost=2,
memory_cost=65536,
parallelism=2,
hash_len=32,
type=Type.ID
)
Обработка исключений
-
VerifyMismatchError
: неправильный пароль -
InvalidHash
: повреждённый или несовместимый хэш -
VerificationError
: общее исключение верификации
Интеграция с фреймворками
FastAPI:
from argon2 import PasswordHasher
ph = PasswordHasher()
def hash_password(password: str):
return ph.hash(password)
def verify_password(password: str, hashed: str):
return ph.verify(hashed, password)
Flask/Django:
Логика схожа, но встроенные модули обычно используют PBKDF2. Argon2 можно внедрить через кастомные backend-классы.
Сравнение с другими алгоритмами
Алгоритм | Защита от GPU | Атаки по времени | Гибкость | Рекомендация |
---|---|---|---|---|
Argon2 | Да | Да | Да | ★★★★★ |
bcrypt | Средняя | Нет | Низкая | ★★★★ |
PBKDF2 | Нет | Да | Средняя | ★★★ |
scrypt | Да | Частично | Да | ★★★★ |
Безопасность и лучшие практики
-
Не хэшируйте один и тот же пароль с одной солью
-
Используйте
check_needs_rehash()
при смене параметров -
Не передавайте хэш напрямую клиенту
-
Храните соль внутри хэша (argon2 делает это сам)
Реальные применения
-
Хэширование паролей пользователей
-
Хранение мастер-паролей
-
Аутентификация устройств IoT
-
Безопасный login backend
Полный список функций и свойств библиотеки argon2-cffi
с описанием, сгруппированных по категориям
Библиотека argon2-cffi
— это обёртка над Argon2 (алгоритм хеширования паролей, победитель Password Hashing Competition), реализованная на C через CFFI. Используется в системах с высокими требованиями к безопасности: Django, FastAPI, Linux-аутентификация.
Основные функции для хеширования паролей
Функция | Описание |
---|---|
argon2.PasswordHasher() |
Основной класс для безопасного хеширования и проверки паролей. |
hasher.hash(password) |
Создаёт Argon2-хеш из пароля. |
hasher.verify(hash, password) |
Проверяет, соответствует ли пароль переданному хешу. |
hasher.check_needs_rehash(hash) |
Проверяет, нужно ли пересоздать хеш (например, если изменились параметры безопасности). |
Параметры PasswordHasher
Параметр | Описание |
---|---|
time_cost |
Количество итераций (по умолчанию 2). |
memory_cost |
Память в KB (по умолчанию 51200 = 50 MB). |
parallelism |
Количество параллельных потоков. |
hash_len |
Размер выходного хеша. |
salt_len |
Длина случайной соли. |
type |
Тип Argon2: Type.I , Type.D , Type.ID (по умолчанию Type.ID ). |
Пример:
Исключения
Исключение | Описание |
---|---|
argon2.exceptions.VerifyMismatchError |
Пароль не соответствует хешу. |
argon2.exceptions.VerificationError |
Общая ошибка при проверке. |
argon2.exceptions.HashingError |
Ошибка при попытке создать хеш. |
argon2.exceptions.InvalidHash |
Невалидный или повреждённый хеш. |
argon2.exceptions.VerificationError |
Базовое исключение для ошибок верификации. |
Низкоуровневые вызовы (при необходимости)
Функция | Описание |
---|---|
argon2.low_level.hash_secret(...) |
Прямой вызов C-реализации Argon2. |
argon2.low_level.verify_secret(...) |
Проверка хеша вручную. |
argon2.low_level.Type |
Выбор между I , D , ID . |
argon2.low_level.ARGON2_VERSION |
Текущая версия используемой реализации. |
Кодеки и форматы
Функция | Описание |
---|---|
argon2.PasswordHasher().hash() |
Возвращает строку в формате $argon2id$v=19$... |
argon2.PasswordHasher().verify() |
Принимает строку в формате Argon2-hash. |
argon2.PasswordHasher().check_needs_rehash() |
Сравнивает параметры хеша с текущими установками и определяет необходимость пересоздания. |
Пример использования
Заключение
argon2-cffi — это лучшее решение для хэширования паролей в Python. Он безопасен по умолчанию, гибко настраивается и поддерживает лучшие практики OWASP. Он используется в проектах любой сложности: от небольших скриптов до масштабных бэкендов, и подходит для тех, кто заботится о защите пользователей и данных.