Гид по технологиям

Хеширование паролей в Python с bcrypt

5 min read Безопасность Обновлено 08 Jan 2026
Хеширование паролей в Python с bcrypt
Хеширование паролей в Python с bcrypt

Экран с кодом и символом замка, символизирующий защиту паролей

Почему хешировать пароли

Хеширование паролей превращает исходный пароль в необратимое представление. В отличие от шифрования, хеширование специально рассчитано на то, чтобы восстановление исходной строки было вычислительно нецелесообразным. Это минимизирует риск утечки учетных данных при компрометации базы данных.

В двух строках: соль — случайная добавка к паролю перед хешированием; фактор стоимости (work factor) — параметр, который замедляет вычисление хеша и делает атаки методом перебора дороже.

Как работает bcrypt

bcrypt — алгоритм хеширования паролей с адаптивной стоимостью. Он автоматически генерирует соль (случайные байты) и включает в итоговый хеш информацию о факторе стоимости. При проверке bcrypt читает хеш, извлекает соль и фактор стоимости и применяет ту же функцию, чтобы сравнить результат.

Ключевые свойства:

  • соль генерируется автоматически (обычно 16 байт), уникальна для каждого пароля;
  • фактор стоимости задаёт экспоненциальное число итераций (обычно 12 рекомендуется как стартовая точка);
  • итоговый хеш включает параметр стоимости и соль, поэтому для проверки достаточно хранить единую строку хеша.

Установка и настройка bcrypt

Создайте виртуальное окружение и установите пакет:

pip install bcrypt

На некоторых системах потребуется компилятор C или предварительно собранные бинарные колеса. Если установка не проходит, проверьте сообщения об ошибках и установите зависимости для сборки (например, build-essential на Linux).

Хеширование пароля — пример в чистом Python

Ниже рабочий пример, который кодирует строку в UTF‑8, генерирует соль и хеширует пароль. Комментарии на русском, код готов к запуску.

import bcrypt

password = "mypasswordstring"

# Кодируем строку в байты utf-8
password_bytes = password.encode('utf-8')

# Генерируем соль и хешируем. rounds — фактор стоимости; по умолчанию bcrypt.gensalt() использует 12
salt = bcrypt.gensalt(rounds=12)
hashed_password = bcrypt.hashpw(password_bytes, salt)
print(hashed_password)  # выводит байтовую строку хеша

Обратите внимание: каждый запуск даст разный результат даже для одинакового пароля — это нормальное поведение благодаря соли.

Проверка пароля при аутентификации

Когда пользователь вводит пароль, вы кодируете ввод и используете bcrypt.checkpw, чтобы сравнить с сохранённым хешем:

import bcrypt

# допустим, hashed_password взят из базы данных (тип — bytes)
# hashed_password = b"..."

entered = input("Введите пароль: ")
entered_bytes = entered.encode('utf-8')

if bcrypt.checkpw(entered_bytes, hashed_password):
    print("Успешная аутентификация")
else:
    print("Неверный пароль")

bcrypt сам разбирает хеш, извлекает соль и фактор стоимости, и применяет ту же функцию хеширования для проверки.

Пример вывода в терминале: проверка пароля bcrypt

Рекомендации по параметрам и эксплуатации

Important: выбирайте фактор стоимости (rounds) исходя из баланса безопасности и производительности вашей инфраструктуры. Рекомендация:

  • начало — rounds = 12 (подойдёт для большинства приложений в 2020-х);
  • для высоко нагруженных систем тестируйте увеличение до 13–14 только после измерений задержки и CPU;
  • регулярная ревизия: увеличивайте rounds по мере роста доступной вычислительной мощности злоумышленников.

Полезные практики:

  • никогда не храните пароли в явном виде;
  • используйте HTTPS для передачи паролей;
  • применяйте rate limiting и блокировки после ряда неудачных попыток;
  • рассматривайте «pepper» — глобальный секрет на сервере, хранящийся отдельно от БД (альтернативная защита при компрометации хешей).

Когда bcrypt может не подойти

  • Если вам нужна защита против атак со специализированным оборудованием (ASIC), современный выбор — Argon2, который лучше противостоит GPU/ASIC ускорению.
  • Если жёсткие требования по времени отклика и высокая нагрузка: bcrypt с высоким rounds может оказывать слишком большую нагрузку на CPU.
  • Для хранения данных, требующих симметричного восстановления (например, API‑ключи, которые нужно вернуть в оригинальном виде) — хеширование не предназначено.

Альтернативы и сравнение

АлгоритмПлюсыМинусы
bcryptШироко поддерживается, прост в использованииМенее устойчив к GPU, чем Argon2
Argon2Выигрывает на сопротивлении GPU/ASIC, настраиваемая памятьМеньшая распространённость в старом коде, сложнее подобрать параметры
scryptХорошо использует память, затрудняет параллелизмСложнее настройка, реже в стандартных библиотеках
PBKDF2Стандартизован, реализован в многих платформахБыстрее на современных CPU, может быть менее безопасен при слабых параметрах

Выбор зависит от требований проекта: для большинства веб-приложений bcrypt остаётся хорошим и проверенным выбором; для новых проектов с высокими требованиями к стойкости против ASIC лучше рассмотреть Argon2.

Мини‑методология: как внедрить хеширование паролей в приложении

  1. При регистрации: принять пароль, валидировать (длина, проверка на слабые пароли), закодировать в UTF-8, сгенерировать соль и сохранить результат bcrypt.hashpw.
  2. При входе: принять ввод, кодировать, использовать bcrypt.checkpw с хешем из БД.
  3. Миграция старых паролей: при первом успешном входе пользователя, если у вас есть устаревший хеш, вычисляйте и сохраняйте новый bcrypt‑хеш (поэтапная миграция).
  4. Регулярно пересматривайте фактор стоимости и повышайте его по мере необходимости.

Роль‑ориентированные чек‑листы

Для разработчика:

  • внедрить код хеширования и проверки;
  • валидировать ввод и минимальную длину;
  • логировать неудачные попытки без записи паролей.

Для ревьювера безопасности:

  • проверить, что пароли не пишутся в логи;
  • убедиться в наличии rate limiting;
  • оценить фактор стоимости и нагрузку на инстансы.

Для DevOps:

  • мониторить CPU и время отклика при росте rounds;
  • обеспечить безопасное хранение «pepper» при использовании;
  • планировать масштабирование под пиковую нагрузку аутентификации.

Критерии приёмки

  • Хеши паролей не содержат открытого текста паролей.
  • Проверка пароля возвращает true для корректного ввода и false для некорректного.
  • Невозможно извлечь исходный пароль из хеша за разумное время при текущем уровне вычислительных ресурсов.
  • Логирование не содержит сырого пароля.

Краткий фактбокс

  • Стандартный размер соли bcrypt — 16 байт (128 бит).
  • Типичная стартовая настройка фактора стоимости — 12.
  • Итоговый хеш включает версию алгоритма, фактор стоимости и соль.

Безопасность и соблюдение приватности

  • Для соответствия требованиям защиты персональных данных (например, GDPR) хеширование паролей — обязательный минимум. Храните только необходимые данные и обеспечьте политики удаления/минимизации базы данных.
  • Если используете «pepper», храните его в защищённом хранилище (например, HSM или система управления секретами).

Глоссарий в одну строку

  • bcrypt — адаптивная функция хеширования паролей; соль — случайные данные, добавляемые к паролю; фактор стоимости — параметр, замедляющий вычисление хеша; pepper — дополнительный секрет, хранящийся отдельно.

Заключение

bcrypt остаётся простым и надёжным инструментом для хеширования паролей в большинстве веб‑приложений. Правильная настройка фактора стоимости, безопасное хранение хешей и дополнительные меры (rate limiting, pepper, мониторинг) помогут значительно снизить риск компрометации учетных записей. При высоких требованиях к устойчивости против специализированного оборудования рассмотрите Argon2.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Отключить AirPlay на iPhone, Mac и Apple TV
Руководство

Отключить AirPlay на iPhone, Mac и Apple TV

Grammarly в React — интеграция SDK
Разработка

Grammarly в React — интеграция SDK

Диаграммы для идей и планирования
Продуктивность

Диаграммы для идей и планирования

Перенос сохранений Nintendo Switch: полный гид
Гайды

Перенос сохранений Nintendo Switch: полный гид

Звонки с Windows 11 через Intel Unison
Инструкции

Звонки с Windows 11 через Intel Unison

Клонирование жёсткого диска — руководство
Аппаратное обеспечение

Клонирование жёсткого диска — руководство