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

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

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

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

Введение

Защита пользовательских паролей — первостепенная задача в любой системе аутентификации. Использование простых или устаревших хэш-функций, таких как 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).

Пример:

python
import bcrypt password = b"secret123" hashed = bcrypt.hashpw(password, bcrypt.gensalt()) is_valid = bcrypt.checkpw(password, hashed)

Работа с солью и настройками

Функция / параметр Описание
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-строка (в байтах)

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

python
import bcrypt # Хеширование password = b"my_secure_password" salt = bcrypt.gensalt(rounds=12) hashed = bcrypt.hashpw(password, salt) # Проверка if bcrypt.checkpw(password, hashed): print("Пароль верный") else: print("Неверный пароль")

Заключение

Bcrypt остаётся одним из самых надёжных инструментов хэширования паролей в Python. Его простота, устойчивость к атакам и широкая поддержка делают его лучшим выбором для большинства аутентификационных систем. Несмотря на конкуренцию с более современными алгоритмами, bcrypt до сих пор оправдывает доверие миллионов проектов.