Метод iron.unseal используется для обратной операции по
отношению к iron.seal и предназначен для восстановления
исходного объекта из защищённой строки, созданной библиотекой
@hapi/iron. Эта операция включает
проверку целостности данных, аутентификацию через HMAC и расшифровку
содержимого, если оно было зашифровано.
В актуальных версиях библиотеки функция может использоваться в асинхронном виде:
Iron.unseal(sealed, password, options)
или через callback-стиль:
Iron.unseal(sealed, password, options, (err, unsealed) => {})
Возвращаемое значение — объект, восстановленный из защищённого контейнера.
iron.unseal решает сразу несколько задач:
Строка, передаваемая в метод, обычно была ранее создана через
iron.seal, где объект сериализуется, подписывается и при
необходимости шифруется.
Строка, содержащая защищённые данные.
Формат обычно включает несколько частей:
Любое изменение строки приводит к ошибке проверки целостности.
Ключ или пароль, используемый для:
Типичный параметр безопасности. От его качества напрямую зависит устойчивость всей схемы защиты.
Объект конфигурации, управляющий поведением алгоритма.
Основные параметры:
encryption
true — включает шифрование payloadfalse — используется только подпись без шифрованияttlSec
algorithm
aes-256-cbc)password
integrity
При вызове iron.unseal происходит последовательный
процесс:
Если любой этап не проходит проверку, операция завершается ошибкой.
Метод может выбрасывать или возвращать следующие типы ошибок:
Bad HMAC
Bad Encryption
Expired
Bad Format
Decryption Failure
import Iron from '@hapi/iron';
const sealed = 'Fe26.2**...';
const password = 'super-secure-password';
const options = {
encryption: true,
ttlSec: 3600
};
const unsealed = await Iron.unseal(sealed, password, options);
console.log(unsealed);
Результатом будет исходный объект, например:
{
userId: 42,
role: 'admin',
session: {
valid: true
}
}
Хотя операция кажется синхронной по логике, современные версии библиотеки поддерживают Promise-обёртку. Это важно, поскольку внутри может использоваться криптографический API Node.js, который оптимизирован под асинхронное выполнение.
Iron.unseal(sealed, password, options)
.then(data => {
console.log(data);
})
.catch(err => {
console.error(err);
});
Механизм unseal опирается на комбинацию двух принципов:
Если включено только подписание без шифрования, данные остаются читаемыми, но защищены от подмены.
Если включено шифрование:
Ключевой момент: даже незначительное изменение одного байта делает строку недействительной.
Параметр ttlSec добавляет временную ограниченность
данным.
При проверке выполняется:
Если срок истёк, метод прекращает выполнение и возвращает ошибку Expired.
Сессии пользователя
{
userId: 10,
sessionId: 'abc123'
}
JWT-подобные токены без JWT
{
scope: ['read', 'write'],
expires: 1710000000
}
Защищённые cookies
iron.sealseal создаёт защищённую строку из объекта.
unseal выполняет обратное преобразование.
Ключевое различие:
seal → сериализация + защитаunseal → проверка + восстановлениеЛюбое несоответствие версии может привести к невозможности расшифровки даже при правильном ключе.
После успешного вызова возвращается JavaScript-объект без дополнительной обёртки. Он уже десериализован, и дальнейшая работа с ним не требует дополнительных преобразований.
const data = await Iron.unseal(...);
if (data.role === 'admin') {
// доступ разрешён
}
Метод не пытается “исправить” повреждённые данные. Любое отклонение от ожидаемого формата приводит к отказу выполнения операции, что является частью модели безопасности: предпочтение отдается отказу, а не восстановлению с возможной компрометацией данных.