В реальных системах аутентификации неизбежно возникает ситуация, когда в одной базе данных сосуществуют пароли, захешированные разными алгоритмами. Это связано с эволюцией криптографических практик: более старые алгоритмы постепенно заменяются на более устойчивые, но данные пользователей при этом продолжают существовать в исходном виде. Библиотека 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 выполняет разбор строки хеша и определяет используемый алгоритм автоматически.
Процесс включает следующие этапы:
Ключевой момент заключается в том, что логика проверки не зависит от внешней конфигурации. Алгоритм определяется исключительно содержимым строки.
Сосуществование нескольких форматов обычно возникает в процессе перехода на более безопасный алгоритм. Полная миграция всех записей сразу не требуется и часто нецелесообразна из-за нагрузки на систему.
Используется стратегия lazy rehashing:
Таким образом миграция распределяется по времени и не создаёт пиковых нагрузок.
Поддержка нескольких форматов требует строгой обратной совместимости:
Password-hash реализует принцип read-compatibility, при котором любая ранее созданная строка остаётся валидной до момента её явного обновления.
При работе с несколькими схемами хеширования часто возникают следующие проблемы:
1. Утрата префикса алгоритма Если при хранении хеша удаляется служебная часть строки, становится невозможно определить алгоритм проверки.
2. Двойное хеширование Повторное применение хеш-функции к уже захешированному значению приводит к невозможности верификации.
3. Неправильная сериализация Изменение структуры
строки (например, экранирование символов $) нарушает
совместимость форматов.
4. Жёсткая привязка к одному алгоритму в коде Фиксация bcrypt или другого алгоритма в логике приложения исключает возможность сосуществования форматов.
Смешанные базы хешей создают неоднородную нагрузку, поскольку разные алгоритмы имеют различную вычислительную стоимость.
Особенности:
Password-hash позволяет унифицировать вызов проверки, однако производительность зависит от распределения алгоритмов в базе.
Для балансировки нагрузки применяется:
Смешанная база требует введения политики актуализации хешей.
Используется правило:
Это обеспечивает постепенный переход всей базы на единый современный стандарт без отдельной миграционной операции.
В архитектуре с поддержкой нескольких форматов библиотека выступает как слой абстракции между приложением и криптографическими примитивами.
Основные принципы эксплуатации:
Такой подход позволяет системе оставаться устойчивой к изменению криптографических стандартов без переработки структуры данных и бизнес-логики.