Одна из самых частых проблем при работе с Iron возникает при попытке
расшифровать ранее сериализованный объект. Сообщение об ошибке вида
Integrity check failed означает, что контроль целостности
данных не пройден.
Причины:
password, отличный от того, который
применялся при Iron.sealiron options (например,
encryption, integrity, ttl)Типичный пример неправильного использования:
const sealed = await Iron.seal({ user: 'alex' }, 'secret1', Iron.defaults);
// позже
const unsealed = await Iron.unseal(sealed, 'secret2', Iron.defaults);
Даже различие в одном символе пароля полностью ломает процесс восстановления данных.
Bad hmac valueОшибка появляется на этапе проверки HMAC (контрольной подписи данных).
Основные причины:
+, /, = в base64)salt, password или
encryptionОсобенно часто проблема возникает при передаче токена через query string:
const url = `/session?token=${sealed}`;
Если не использовать кодирование:
encodeURIComponent(sealed)
строка может быть интерпретирована неправильно, и HMAC проверка провалится.
ttl и истечение времениIron поддерживает временные ограничения через параметр
ttl (time to live). При его использовании данные
автоматически становятся недействительными.
Симптомы:
Iron.unseal возвращает ошибку истечения срокаПричины:
ttl (в миллисекундах)Пример проблемной конфигурации:
const options = {
ttl: 1000 * 60 * 5 // 5 минут
};
Если сервер и клиент имеют разницу во времени даже в несколько минут, токены становятся недействительными раньше ожидаемого срока.
Unexpected token при unsealВозникает на этапе десериализации JSON после расшифровки.
Причины:
Iron.seal)JSON.stringify
выполнен дважды)Пример ошибки:
const bad = "\"{\\\"user\\\":\\\"alex\\\"}\"";
После расшифровки получается строка, которая не соответствует ожидаемому JSON.
Iron использует набор криптографических параметров по умолчанию.
Любое расхождение между seal и unseal приводит
к невозможности восстановления данных.
Частые ошибки:
Iron.defaults в разных частях системыencryption (например,
aes-256-cbc vs aes-128-cbc)iterationCount и
saltBitsПример:
const optionsA = { encryption: 'aes-256-cbc' };
const optionsB = { encryption: 'aes-128-cbc' };
Даже при одинаковом пароле данные становятся несовместимыми.
Iron ожидает корректный формат входных данных. Передача
Buffer без преобразования часто приводит к непредсказуемому
поведению.
Проблемный случай:
const data = Buffer.from(JSON.stringify({ user: 'alex' }));
await Iron.seal(data, password, Iron.defaults);
Внутри библиотеки данные могут быть интерпретированы некорректно, что приводит к ошибкам целостности или невозможности восстановления.
Корректный подход — явное приведение:
JSON.stringify({ user: 'alex' })
seal и
unsealIron строго зависит от согласованности параметров. Перестановка аргументов приводит к полной несовместимости.
Типичная ошибка:
Iron.seal(data, options, password);
вместо:
Iron.seal(data, password, options);
Такая ошибка не вызывает синтаксическую ошибку JavaScript, но полностью ломает криптографическую структуру результата.
При вложенных структурах часто происходит потеря типов данных.
Сценарии:
Date превращаются в строкиundefined удаляется при сериализацииMap и Set теряют структуруПосле unseal восстановленный объект отличается от
исходного, хотя криптографически операция успешна.
Пример:
const original = {
date: new Date(),
map: new Map([['a', 1]])
};
После восстановления:
date становится строкойmap превращается в пустой объект или теряет
структуруРазные версии Iron используют несовместимые внутренние алгоритмы сериализации.
Симптомы:
Bad hmac value или
Integrity check failedОсобенно критично при:
Попытка повторного применения Iron.seal к уже
зашифрованной строке приводит к разрушению структуры данных.
Сценарий:
const first = await Iron.seal(data, password, Iron.defaults);
const second = await Iron.seal(first, password, Iron.defaults);
В результате второй слой невозможно корректно расшифровать без строгого соблюдения порядка операций.
При сохранении sealed-строки часто возникают проблемы с экранированием.
Причины:
Особенно часто страдают символы:
;=+Без предварительного encodeURIComponent данные могут
быть искажены до невалидного состояния.