Версионирование схемы токена

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

В Iron sealed-объект не является «просто строкой шифротекста». Это составная структура, в которой одновременно присутствуют данные, параметры криптографических преобразований и служебные поля, необходимые для восстановления исходного объекта.

Типичная структура включает:

  • зашифрованную полезную нагрузку (payload)
  • инициализирующий вектор (IV)
  • MAC для проверки целостности
  • метаданные алгоритма шифрования и хэширования
  • параметры деривации ключа
  • временные ограничения (ttl, exp)
  • служебные поля сериализации

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

Зачем нужна версия схемы

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

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

Без версии система была бы вынуждена угадывать формат токена, анализируя структуру эвристически, что недопустимо в криптографическом контексте.

Структурное представление зашифрованного объекта

В Iron sealed payload концептуально делится на две зоны:

  1. Данные приложения Сериализованный объект, который требуется защитить. Обычно JSON-подобная структура.

  2. Криптографический контейнер Служебные поля, описывающие:

    • алгоритм шифрования (например, AES-256-CBC)
    • алгоритм MAC (например, SHA-256 HMAC)
    • соль и параметры деривации ключа
    • случайные значения (IV, nonce)
    • временные ограничения

Версия схемы влияет на то, как именно интерпретируется этот контейнер.

Механизм определения версии

При восстановлении (unseal) токена первым шагом выполняется разбор сериализованной строки. Формат Iron использует компактное кодирование, где служебные данные кодируются в фиксированной или полуструктурированной последовательности.

Версия схемы может определяться:

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

Далее происходит ветвление логики:

  • если версия распознана → применяется соответствующий декодер
  • если версия неизвестна → операция unseal завершается ошибкой

Это исключает риск некорректной интерпретации данных.

Обратная совместимость

Поддержка нескольких версий схемы одновременно — ключевая характеристика Iron при использовании в долгоживущих системах.

Реализуется это через набор декодеров:

  • декодер v1 обрабатывает старые токены без расширенных метаданных
  • декодер v2 учитывает дополнительные параметры деривации ключа
  • декодер v3 может вводить новые алгоритмы MAC или шифрования

При этом процесс выбора версии всегда детерминирован и не зависит от внешних параметров, кроме самой строки токена.

Важно, что старая версия никогда не «догадывается» о структуре новой версии — несовместимые токены просто не проходят проверку.

Стратегии миграции схемы

При обновлении схемы токена в реальных системах используется несколько стратегий:

Параллельная поддержка версий

Система одновременно умеет:

  • читать старые токены
  • выдавать новые токены

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

Ротация выдачи

После обновления схемы:

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

Это минимизирует влияние на пользователей.

Принудительная инвалидация

Используется редко и только при критических изменениях безопасности:

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

Влияние версии на криптографические параметры

Версия схемы может изменять не только формат, но и сам набор используемых алгоритмов:

  • переход с SHA-1 на SHA-256 в MAC
  • изменение режима шифрования (CBC → GCM)
  • увеличение длины ключа
  • изменение алгоритма деривации ключа (PBKDF2 параметры)

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

Ошибки при отсутствии строгого версионирования

Отсутствие версии или её некорректная реализация приводит к ряду проблем:

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

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

Поведение unseal при несовпадении версии

При обнаружении неподдерживаемой версии выполняется строгое завершение операции:

  • токен не декодируется
  • MAC не проверяется до конца интерпретации
  • результатом является ошибка валидации

Это предотвращает атаки, основанные на подмене структуры токена или попытке эксплуатации несовместимости форматов.

Связь версии схемы с сериализацией

Версия также влияет на способ сериализации:

  • порядок полей внутри строки
  • способ кодирования бинарных данных (base64, base64url)
  • наличие или отсутствие разделителей
  • формат timestamp и TTL

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

Версионирование как часть модели доверия

В Iron версия схемы токена выступает не просто техническим маркером, а частью модели доверия:

  • сервер явно заявляет, какой формат он поддерживает
  • клиентский токен обязан соответствовать этому формату
  • любые отклонения трактуются как нарушение целостности

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