Формат защищённого объекта в Iron представляет собой компактную
строку, в которой закодированы все элементы, необходимые для
восстановления исходных данных и проверки их целостности. Эта строка
имеет строго определённую структуру и состоит из нескольких сегментов,
разделённых символом *. Каждый сегмент несёт отдельную
криптографическую или служебную нагрузку.
Типичный результат работы Iron после сериализации и защиты данных выглядит следующим образом:
Fe26.2*<password-id>*<encryption-salt>*<encryption-iv>*<encrypted-data>*<hmac-salt>*<hmac>*<ttl>
Каждый элемент в этой последовательности кодируется в Base64Url, что позволяет безопасно передавать строку в URL, HTTP-заголовках и cookie без дополнительного экранирования.
Первый элемент Fe26.2 — это версия протокола. Он
фиксирует формат и правила обработки строки. Это важно для обратной
совместимости: разные версии Iron могут интерпретировать данные
по-разному.
Второй сегмент — password-id. Он не содержит сам
секретный ключ, а указывает на его идентификатор в наборе ключей,
используемых для шифрования и подписи.
Такой подход позволяет реализовать ротацию ключей без необходимости расшифровывать все ранее созданные объекты. При получении строки система выбирает нужный ключ по идентификатору и применяет его для проверки HMAC и расшифровки данных.
Следующие два элемента отвечают за криптографическую уникальность каждого сообщения:
encryption-saltencryption-ivСоль используется для усложнения процесса получения ключа шифрования из пароля. Даже при одинаковом исходном ключе разные соли приводят к разным производным ключам.
Инициализационный вектор (IV) обеспечивает уникальность шифротекста при одинаковых входных данных. Это критически важно для режимов блочного шифрования, где повтор IV может привести к утечке структуры данных.
Центральная часть структуры:
<encrypted-data>
Этот сегмент содержит сериализованный и зашифрованный JSON-объект. Перед шифрованием объект проходит этап преобразования в строку (обычно JSON.stringify), после чего подвергается симметричному шифрованию.
На этом этапе данные становятся полностью нечитаемыми без ключа и параметров IV.
Следующий блок:
hmac-salthmacHMAC (Hash-based Message Authentication Code) отвечает за проверку того, что данные не были изменены после создания.
Процесс включает:
Если хотя бы один символ в строке изменён, проверка не проходит, и объект считается повреждённым или поддельным.
Последний элемент:
<ttl>
TTL (time to live) задаёт время жизни защищённого объекта. Он может быть представлен в миллисекундах или специальном формате времени.
При расшифровке система сравнивает текущую метку времени с моментом создания объекта. Если TTL истёк, даже корректный HMAC не позволяет восстановить данные.
После успешной проверки и дешифровки формируется исходный
JavaScript-объект. Его структура полностью соответствует данным, которые
были переданы до вызова Iron.seal.
Пример логической структуры результата:
{
data: Object,
createdAt: Number,
ttl: Number
}
В зависимости от настроек сериализации могут добавляться дополнительные служебные поля, но они не входят в зашифрованную часть и не влияют на криптографическую проверку.
Формирование sealed-строки проходит несколько последовательных этапов:
Каждый этап строго детерминирован, что позволяет воспроизводить результат при наличии одинаковых входных параметров.
При обратной операции строка разбивается по символу *,
после чего выполняется:
Любое несоответствие на любом этапе приводит к немедленному прерыванию процесса без возврата данных.
Особенность структуры Iron заключается в том, что каждый элемент зависит от остальных:
Таким образом, строка представляет собой связанный криптографический контейнер, а не набор независимых полей.
Внутренняя структура объекта ответа в Iron фактически превращает обычный JavaScript-объект в линейное представление криптографического контейнера. Он сочетает:
Каждый компонент выполняет строго определённую роль, а итоговая строка является единственной точкой взаимодействия между защищёнными данными и внешней средой.