Iron-токены представляют собой защищённые контейнеры для данных, в которых одновременно обеспечиваются свойства целостности, аутентичности и конфиденциальности. В отличие от обычных подписанных структур, где данные остаются читаемыми, Iron использует модель «sealed data», в которой содержимое полностью шифруется и становится недоступным без корректного ключа.
Основная цель механизма — безопасная передача и хранение произвольных структур данных (объектов, строк, сессий), исключая возможность их чтения или незаметного изменения.
Iron построен на комбинации симметричных и хеш-функций:
Ключевая особенность — отсутствие асимметричной криптографии. Один секрет используется для полного цикла: создания и проверки токена.
Формирование Iron-токена происходит через последовательность криптографических преобразований.
Исходный объект сериализуется в строку (обычно JSON). Далее он дополняется служебной метаинформацией:
Из общего секретного пароля выводятся производные ключи:
Процесс основан на PBKDF2 с солью, что защищает от атак перебора.
E = {k{enc}}(plaintext, iv)
Исходные данные преобразуются в зашифрованный блок с использованием случайного IV (инициализационного вектора). Это гарантирует, что одинаковые данные будут давать разные результаты при каждом создании токена.
HMAC = {k{mac}}(ciphertext ;||; iv ;||; metadata)
Подпись вычисляется по всему набору данных, включая зашифрованный текст и метаданные. Это предотвращает любые незаметные модификации.
Токен собирается в сериализованную структуру, которая включает:
Все части кодируются (обычно Base64URL) и объединяются в строку с разделителями.
Типичная структура выглядит как последовательность сегментов:
id * iv * encrypted * hmac
Дополнительно могут присутствовать:
Каждый сегмент несёт строго определённую функцию, и изменение любого из них делает токен недействительным.
Расшифровка выполняется строго симметрично процессу создания.
Токен разбивается на составные части. Извлекаются:
Сначала пересчитывается HMAC:
HMAC’ = {k{mac}}(ciphertext ;||; iv ;||; metadata)
Если значения не совпадают, дальнейшая обработка прекращается.
На основе salt и общего секрета снова выводятся ключи шифрования и проверки.
plaintext = ^{-1}{k{enc}}(ciphertext, iv)
После успешной проверки целостности данные расшифровываются и десериализуются обратно в исходный объект.
После расшифровки проверяются ограничения:
Если одно из условий нарушено, токен считается недействительным.
Каждый из этих элементов выполняет отдельную задачу:
Совместное использование этих значений делает невозможным повторное использование токена в атакующих сценариях.
Iron-токены чувствительны к смене ключей. Обычно используется схема:
Это позволяет:
При смене ключа старые токены становятся недействительными без необходимости их хранения.
Iron обеспечивает одновременно три уровня защиты:
Отсутствие одного из этих уровней в альтернативных подходах (например, простых JWT без шифрования) делает Iron более строгим с точки зрения защиты данных.
В отличие от JWT:
Это делает Iron ближе к модели защищённых контейнеров, чем к токенам идентификации.
В практической интеграции часто встречаются ошибки:
Каждая из этих ошибок снижает криптографическую стойкость всей схемы.
При попытке изменения токена:
Даже минимальная модификация одного байта приводит к полной невалидности структуры, что исключает скрытые атаки на содержимое.