Принцип работы Iron-токенов

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

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

Криптографическая основа

Iron построен на комбинации симметричных и хеш-функций:

  • Симметричное шифрование обеспечивает конфиденциальность данных (обычно AES-256-CBC)
  • HMAC обеспечивает целостность и защиту от подмены
  • PBKDF2 используется для получения ключей из пароля
  • Случайные значения (salt, iv, nonce) гарантируют уникальность каждого токена

Ключевая особенность — отсутствие асимметричной криптографии. Один секрет используется для полного цикла: создания и проверки токена.

Процесс формирования токена (seal)

Формирование Iron-токена происходит через последовательность криптографических преобразований.

1. Подготовка входных данных

Исходный объект сериализуется в строку (обычно JSON). Далее он дополняется служебной метаинформацией:

  • timestamp создания
  • TTL (время жизни)
  • случайный nonce
  • идентификатор ключа (key id)

2. Генерация ключей

Из общего секретного пароля выводятся производные ключи:

  • ключ шифрования
  • ключ HMAC

Процесс основан на PBKDF2 с солью, что защищает от атак перебора.

3. Шифрование содержимого

E = {k{enc}}(plaintext, iv)

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

4. Формирование подписи

HMAC = {k{mac}}(ciphertext ;||; iv ;||; metadata)

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

5. Сборка итогового токена

Токен собирается в сериализованную структуру, которая включает:

  • версию алгоритма
  • идентификатор ключа
  • соль
  • IV
  • зашифрованный payload
  • HMAC

Все части кодируются (обычно Base64URL) и объединяются в строку с разделителями.

Формат Iron-токена

Типичная структура выглядит как последовательность сегментов:

id * iv * encrypted * hmac

Дополнительно могут присутствовать:

  • версия протокола
  • salt
  • временные метки
  • параметры шифрования

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

Процесс расшифровки (unseal)

Расшифровка выполняется строго симметрично процессу создания.

1. Разбор структуры

Токен разбивается на составные части. Извлекаются:

  • salt
  • iv
  • ciphertext
  • hmac

2. Проверка целостности

Сначала пересчитывается HMAC:

HMAC’ = {k{mac}}(ciphertext ;||; iv ;||; metadata)

Если значения не совпадают, дальнейшая обработка прекращается.

3. Восстановление ключей

На основе salt и общего секрета снова выводятся ключи шифрования и проверки.

4. Дешифрование

plaintext = ^{-1}{k{enc}}(ciphertext, iv)

После успешной проверки целостности данные расшифровываются и десериализуются обратно в исходный объект.

5. Проверка метаданных

После расшифровки проверяются ограничения:

  • срок жизни (TTL)
  • время создания
  • допустимость ключа (key rotation)

Если одно из условий нарушено, токен считается недействительным.

Роль salt, nonce и IV

Каждый из этих элементов выполняет отдельную задачу:

  • salt — защищает ключи от предвычисленных атак
  • nonce — обеспечивает уникальность токена
  • IV — предотвращает детерминированность шифрования

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

Управление ключами

Iron-токены чувствительны к смене ключей. Обычно используется схема:

  • основной секрет (password)
  • версии ключей (key rotation)
  • идентификаторы ключей внутри токена

Это позволяет:

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

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

Безопасностные свойства

Iron обеспечивает одновременно три уровня защиты:

  • Конфиденциальность — данные полностью зашифрованы
  • Целостность — любые изменения обнаруживаются через HMAC
  • Аутентичность — токен подтверждает знание секрета

Отсутствие одного из этих уровней в альтернативных подходах (например, простых JWT без шифрования) делает Iron более строгим с точки зрения защиты данных.

Отличие от JWT

В отличие от JWT:

  • JWT обычно читаем без ключа (если нет encryption layer)
  • Iron всегда шифрует payload
  • JWT опирается на подпись, Iron — на sealed encryption + MAC
  • Iron не предполагает «публичность» содержимого

Это делает Iron ближе к модели защищённых контейнеров, чем к токенам идентификации.

Типовые ошибки использования

В практической интеграции часто встречаются ошибки:

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

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

Поведение при атакующих сценариях

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

  • изменённый ciphertext ломает HMAC
  • подмена iv делает невозможным корректное дешифрование
  • изменение метаданных приводит к несоответствию подписи

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