Что такое хеширование паролей и зачем оно нужно

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

Хеш-функция обладает рядом ключевых свойств:

  • Детерминированность — одинаковый ввод всегда даёт одинаковый результат
  • Необратимость — восстановить исходные данные по хешу невозможно
  • Устойчивость к коллизиям — вероятность того, что разные входные данные дадут одинаковый хеш, крайне мала
  • Чувствительность к изменениям — малейшее изменение входных данных полностью меняет результат

Пример:

пароль: password123
хеш: $2a$10$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36FZ0pniS3pSkeCZMt2rt7e

Даже незначительное изменение строки (password124) приведёт к совершенно другому хешу.


Почему нельзя хранить пароли в открытом виде

Хранение паролей в открытом виде (plain text) — одна из самых критичных ошибок в разработке систем аутентификации.

Основные риски:

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

Если пароли хранятся в открытом виде, компрометация базы данных автоматически означает компрометацию всех аккаунтов.


Принцип работы аутентификации с хешированием

Процесс регистрации:

  1. Пользователь вводит пароль
  2. Пароль проходит через хеш-функцию
  3. В базе данных сохраняется только хеш

Процесс входа:

  1. Пользователь вводит пароль
  2. Введённый пароль хешируется
  3. Полученный хеш сравнивается с сохранённым

Если значения совпадают — доступ предоставляется.


Ограничения простого хеширования

Использование обычных криптографических функций (например, SHA-256) недостаточно для защиты паролей.

Проблемы:

1. Высокая скорость вычисления

Современные хеш-функции разработаны для максимальной производительности. Это делает их уязвимыми для атак перебора (brute force).

Злоумышленник может проверять миллионы паролей в секунду.

2. Атаки по словарю

Используются заранее подготовленные списки популярных паролей:

123456
password
qwerty
admin

Хеши таких значений легко вычисляются заранее.

3. Радужные таблицы (rainbow tables)

Это базы данных, содержащие пары:

пароль → хеш

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


Соль (Salt) и её роль

Соль — это случайная строка, добавляемая к паролю перед хешированием.

hash = hash(пароль + соль)

Пример:

пароль: password123
соль: XyZ!9kLm
результат: hash(password123XyZ!9kLm)

Свойства соли:

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

Зачем нужна соль:

  • защита от радужных таблиц
  • предотвращение совпадений хешей
  • усложнение массовых атак

Медленные хеш-функции

Для защиты паролей используются специальные алгоритмы, намеренно замедленные.

Идея:

  • сделать проверку пароля быстрой для сервера
  • сделать перебор паролей крайне дорогим для атакующего

Такие алгоритмы:

  • выполняют тысячи итераций
  • используют дополнительную память
  • настраиваются по уровню сложности

bcrypt как специализированный алгоритм

bcrypt — это адаптивный алгоритм хеширования паролей, разработанный специально для защиты от атак перебора.

Основные особенности:

1. Встроенная соль

bcrypt автоматически генерирует соль и включает её в итоговый хеш:

$2a$10$EixZaYVK1fsbw1ZfbX3OXe...

Структура:

  • $2a$ — версия алгоритма
  • 10 — cost factor (сложность)
  • остальная часть — соль и хеш

2. Настраиваемая сложность (cost factor)

Параметр определяет количество итераций:

2^cost

Пример:

  • cost = 10 → 1024 итерации
  • cost = 12 → 4096 итераций

Чем выше значение — тем медленнее вычисление.

3. Устойчивость к GPU-атакам

bcrypt использует алгоритмы, плохо оптимизируемые для параллельных вычислений, что снижает эффективность GPU и ASIC.


Почему bcrypt.js используется в JavaScript

bcrypt.js — это реализация алгоритма bcrypt на чистом JavaScript.

Преимущества:

  • не требует нативных модулей
  • работает в Node.js и браузере
  • легко интегрируется в проекты

Недостаток:

  • медленнее нативной реализации (bcrypt), но достаточно безопасен при правильной настройке

Основные угрозы, от которых защищает хеширование

Перебор паролей (Brute Force)

Атакующий проверяет все возможные комбинации:

aaaaaa
aaaaab
aaaaac
...

bcrypt замедляет процесс настолько, что атака становится нецелесообразной.

Словарные атаки

Используются списки популярных паролей.

bcrypt усложняет массовую проверку благодаря:

  • соли
  • высокой стоимости вычисления

Rainbow Table атаки

Становятся бесполезными из-за уникальной соли для каждого пользователя.


Ошибки при реализации хеширования

Использование быстрых хеш-функций

hash = sha256(password)

Недостаток: слишком быстро, легко поддаётся перебору.

Отсутствие соли

hash = hash(password)

Результат: одинаковые пароли → одинаковые хеши.

Использование фиксированной соли

salt = "12345"
hash = hash(password + salt)

Проблема: компрометация соли ломает всю систему.

Слишком низкий cost factor

cost = 4

Результат: атаки становятся дешёвыми и быстрыми.


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

Выбор параметров bcrypt зависит от:

  • мощности сервера
  • количества пользователей
  • требований к безопасности

Практический подход:

  • время хеширования должно быть ~100–300 мс
  • при росте мощности серверов cost factor увеличивается

Почему хеширование — обязательный стандарт

Любая современная система аутентификации должна:

  • не хранить пароли в открытом виде
  • использовать соль
  • применять адаптивные алгоритмы (bcrypt, scrypt, Argon2)

Игнорирование этих принципов приводит к:

  • массовым утечкам данных
  • компрометации аккаунтов
  • юридическим и финансовым последствиям

Связь с библиотекой bcrypt.js

bcrypt.js реализует все ключевые принципы безопасного хеширования:

  • автоматическая генерация соли
  • встроенная настройка сложности
  • безопасное сравнение хешей
  • защита от типичных атак

В дальнейшем изучение библиотеки сводится к практическому применению этих концепций в коде: генерации хеша и проверке пароля при аутентификации.