Введение
Защита пользовательских паролей — первостепенная задача в любой системе аутентификации. Использование простых или устаревших хэш-функций, таких как MD5 или SHA1, приводит к риску утечки и взлома. Одним из проверенных временем решений является bcrypt — алгоритм адаптивного хэширования, устойчивый к атакам по словарю и bruteforce.
В Python bcrypt доступен через библиотеку bcrypt
, разработанную на базе оригинальной OpenBSD-реализации. Она применяется в миллионах проектов и обеспечивает надёжный уровень защиты при минимальной сложности внедрения. В статье рассмотрим теорию, реализацию, параметры, безопасность и интеграцию bcrypt.
Основная часть
Установка
pip install bcrypt
Основы bcrypt
-
Использует алгоритм Blowfish
-
Включает встроенную соль
-
Поддерживает адаптивную нагрузку (cost factor)
-
Хэш фиксированной длины: 60 символов
Быстрый старт
import bcrypt
password = b"supersecret"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
if bcrypt.checkpw(password, hashed):
print("Access granted")
Генерация соли
salt = bcrypt.gensalt(rounds=12) # 12 — параметр сложности
Параметр rounds
Указывает количество итераций (2^rounds). Чем выше значение — тем надёжнее и медленнее.
Рекомендуемое значение: 12–14 для продакшена.
Хэширование паролей
hashed = bcrypt.hashpw(b"mypassword", salt)
Полученный хэш включает соль, поэтому её не нужно хранить отдельно.
Проверка пароля
bcrypt.checkpw(b"mypassword", hashed)
Возвращает True
или False
.
Применение в фреймворках
FastAPI / Flask:
def hash_password(password: str) -> str:
return bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
def verify_password(password: str, hashed: str) -> bool:
return bcrypt.checkpw(password.encode(), hashed.encode())
Ограничения bcrypt
-
Максимальная длина пароля — 72 байта (длинные пароли усекутся без предупреждения)
-
Нет встроенной функции обновления хэшей (надо вручную)
-
Менее гибкий, чем Argon2 (нет параллельности или управления памятью)
Сравнение с другими алгоритмами
Алгоритм | Устойчивость | Параметры | Подпись OWASP | Применение |
---|---|---|---|---|
bcrypt | Высокая | rounds | Да | Очень широко |
Argon2 | Очень высокая | память/время | Да | Рекомендуется |
PBKDF2 | Средняя | итерации | Да | Надёжный |
Лучшие практики
-
Используйте минимум
rounds=12
-
Не усекайте пароли вручную — применяйте KDF
-
Не храните хэши в открытом виде
-
Проверяйте пароли через
checkpw
, а не через==
Реальные кейсы применения
-
Системы логина и регистрации
-
Хэширование API-токенов
-
Защита master-паролей в менеджерах паролей
-
Авторизация в CLI-инструментах
Полный список функций и свойств библиотеки bcrypt
с описанием, сгруппированных по категориям
Библиотека bcrypt
— это минималистичный и надёжный инструмент для безопасного хеширования паролей с использованием одноимённого алгоритма. Работает напрямую с байтами и часто используется в Web-приложениях, API и системах авторизации (включая Flask, FastAPI, Django, Node.js и др.).
Хеширование паролей
Функция | Описание |
---|---|
bcrypt.hashpw(password, salt) |
Создаёт bcrypt-хеш пароля. Оба аргумента должны быть bytes . |
bcrypt.gensalt(rounds=12) |
Генерирует соль для хеширования. Можно задать количество раундов (чем выше, тем медленнее и безопаснее). |
bcrypt.checkpw(password, hashed) |
Проверяет, совпадает ли пароль с хешем (возвращает True /False ). |
Пример:
Работа с солью и настройками
Функция / параметр | Описание |
---|---|
bcrypt.gensalt(rounds=12) |
Количество раундов хеширования (по умолчанию 12). |
salt_prefix=b"2b" |
Указывает версию алгоритма (2a , 2b , 2y ). 2b — стандарт. |
salt = bcrypt.gensalt(rounds=10, prefix=b"2b") |
Генерация соли с нужным префиксом. |
salt[:29] |
Соль + параметры bcrypt встроены в начало хеша (можно повторно использовать). |
Размеры, ограничения и формат
Характеристика | Значение |
---|---|
Максимальная длина пароля | 72 байта (всё, что больше — обрезается) |
Размер хеша | 60 байт (строка в формате $2b$12$... ) |
Поддерживаемые версии | $2a$ , $2b$ , $2y$ |
Выходной формат | ASCII-строка (в байтах) |
Пример полного использования
Заключение
Bcrypt остаётся одним из самых надёжных инструментов хэширования паролей в Python. Его простота, устойчивость к атакам и широкая поддержка делают его лучшим выбором для большинства аутентификационных систем. Несмотря на конкуренцию с более современными алгоритмами, bcrypt до сих пор оправдывает доверие миллионов проектов.