Argon2-cffi – безопасное хэширование

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

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

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

Введение

В эпоху постоянных утечек данных и атак на аутентификацию выбор надёжного алгоритма хэширования паролей — не вопрос предпочтения, а вопрос выживания проекта. Среди всех современных решений 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).

Пример:

python
from argon2 import PasswordHasher hasher = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=2)

Исключения

Исключение Описание
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() Сравнивает параметры хеша с текущими установками и определяет необходимость пересоздания.

Пример использования

python
from argon2 import PasswordHasher ph = PasswordHasher() hash = ph.hash("super_secret") ph.verify(hash, "super_secret") # True

Заключение

argon2-cffi — это лучшее решение для хэширования паролей в Python. Он безопасен по умолчанию, гибко настраивается и поддерживает лучшие практики OWASP. Он используется в проектах любой сложности: от небольших скриптов до масштабных бэкендов, и подходит для тех, кто заботится о защите пользователей и данных.