Сосуществование нескольких форматов хешей в одной базе

В реальных системах аутентификации неизбежно возникает ситуация, когда в одной базе данных сосуществуют пароли, захешированные разными алгоритмами. Это связано с эволюцией криптографических практик: более старые алгоритмы постепенно заменяются на более устойчивые, но данные пользователей при этом продолжают существовать в исходном виде. Библиотека Password-hash в JavaScript ориентирована на работу именно в таких условиях, обеспечивая единый интерфейс для проверки и генерации хешей независимо от используемой схемы.


Формат идентификации хеша

Ключевым элементом поддержки нескольких алгоритмов является самодокументируемый формат строки хеша. Каждый алгоритм кодирует свои параметры прямо внутри результирующей строки.

Типичные примеры:

  • $argon2id$v=19$m=65536,t=3,p=4$...
  • $2b$12$C6UzMDM.H6dfI/f/IKcEeO... (bcrypt)
  • pbkdf2_sha256$29000$...

В библиотеке Password-hash используется принцип префиксного определения алгоритма, при котором:

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

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


Структура хранения в базе данных

При поддержке нескольких форматов хешей схема хранения упрощается до одного поля:

users
----------------------------
id
email
password_hash

Поле password_hash содержит полную строку, включающую идентификатор алгоритма.

Преимущества подхода:

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

Дополнительно иногда используется поле password_updated_at, фиксирующее момент последнего обновления хеша, что важно при политике постепенной миграции.


Алгоритм проверки при авторизации

При проверке пароля Password-hash выполняет разбор строки хеша и определяет используемый алгоритм автоматически.

Процесс включает следующие этапы:

  1. Извлечение префикса алгоритма.
  2. Выбор соответствующего провайдера хеширования.
  3. Декодирование параметров (соль, cost-факторы, память, итерации).
  4. Вычисление хеша от введённого пароля.
  5. Сравнение полученного результата с сохранённым значением.

Ключевой момент заключается в том, что логика проверки не зависит от внешней конфигурации. Алгоритм определяется исключительно содержимым строки.


Миграция и постепенное обновление

Сосуществование нескольких форматов обычно возникает в процессе перехода на более безопасный алгоритм. Полная миграция всех записей сразу не требуется и часто нецелесообразна из-за нагрузки на систему.

Используется стратегия lazy rehashing:

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

Таким образом миграция распределяется по времени и не создаёт пиковых нагрузок.


Совместимость и обратное декодирование

Поддержка нескольких форматов требует строгой обратной совместимости:

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

Password-hash реализует принцип read-compatibility, при котором любая ранее созданная строка остаётся валидной до момента её явного обновления.


Типичные ошибки при смешивании форматов

При работе с несколькими схемами хеширования часто возникают следующие проблемы:

1. Утрата префикса алгоритма Если при хранении хеша удаляется служебная часть строки, становится невозможно определить алгоритм проверки.

2. Двойное хеширование Повторное применение хеш-функции к уже захешированному значению приводит к невозможности верификации.

3. Неправильная сериализация Изменение структуры строки (например, экранирование символов $) нарушает совместимость форматов.

4. Жёсткая привязка к одному алгоритму в коде Фиксация bcrypt или другого алгоритма в логике приложения исключает возможность сосуществования форматов.


Оптимизация производительности

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

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

  • bcrypt быстрее при низких cost-параметрах, но менее гибок;
  • argon2 требует больше памяти, но обеспечивает лучшую защиту;
  • pbkdf2 масштабируется по числу итераций.

Password-hash позволяет унифицировать вызов проверки, однако производительность зависит от распределения алгоритмов в базе.

Для балансировки нагрузки применяется:

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

Политика пере-хеширования

Смешанная база требует введения политики актуализации хешей.

Используется правило:

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

Это обеспечивает постепенный переход всей базы на единый современный стандарт без отдельной миграционной операции.


Практика использования Password-hash

В архитектуре с поддержкой нескольких форматов библиотека выступает как слой абстракции между приложением и криптографическими примитивами.

Основные принципы эксплуатации:

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

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