Операция восстановления данных из защищённой строки в библиотеке Iron
используется для обратного преобразования результата seal.
Метод unseal выполняет проверку целостности, аутентичности
и срока действия зашифрованного контейнера, после чего возвращает
исходный объект.
Ключевая особенность подхода Iron заключается в том, что данные не просто шифруются, а дополнительно защищаются механизмом MAC (message authentication code), что исключает возможность незаметной подмены содержимого.
В актуальных версиях реализации используется асинхронный интерфейс:
await Iron.unseal(sealed, password, options)
Метод возвращает Promise, который резолвится в исходное
значение, восстановленное из защищённого контейнера.
Строка, содержащая ранее запечатанные данные.
Формат строки строго определён библиотекой Iron и включает несколько частей:
Особенности:
seal, иначе результат
будет ошибкойСтрока или буфер, используемый как ключевой материал для расшифровки и проверки подписи.
Роль параметра:
sealРекомендации по безопасности:
Объект конфигурации, определяющий поведение операции восстановления.
Время жизни токена в миллисекундах.
ttl: 24 * 60 * 60 * 1000
Если срок действия истёк, unseal выбросит ошибку, даже
если подпись корректна.
Допустимое отклонение времени между системами в секундах.
Используется для компенсации:
timestampSkewSec: 60
Функция, возвращающая текущее время.
Позволяет переопределить источник времени (например, для тестов):
localtime: () => Date.now()
Алгоритм шифрования, применённый к данным.
Обычно задаётся автоматически, но может быть зафиксирован:
aes-256-cbcaes-128-cbcАлгоритм обеспечения целостности (MAC).
Например:
sha256sha1 (устаревший, не рекомендуется)Дополнительный способ передачи ключа, используется реже и имеет меньший приоритет, чем основной аргумент.
Метод unseal возвращает Promise, который резолвится в
исходный JavaScript-объект:
const value = await Iron.unseal(sealed, password, options)
Любой сериализуемый объект:
Если исходные данные были:
{ userId: 42, role: "admin" }
После unseal возвращается:
{
userId: 42,
role: "admin"
}
Метод прерывает выполнение и выбрасывает исключение в следующих случаях:
Возникает при:
sealedpasswordЕсли задан ttl и время жизни контейнера вышло:
Если строка не соответствует формату Iron:
Если параметры encryption или integrity не
совпадают с теми, что использовались при seal.
import Iron from '@hapi/iron'
const password = 'super-secure-password'
const sealed = await Iron.seal(
{ userId: 1, role: 'admin' },
password,
Iron.defaults
)
const unsealed = await Iron.unseal(
sealed,
password,
{
ttl: 1000 * 60 * 10,
timestampSkewSec: 60
}
)
console.log(unsealed)
До расшифровки данных выполняется:
Если проверка не проходит, дешифрование не выполняется вообще.
Iron сочетает:
Это означает, что:
При использовании ttl важны:
timestampSkewSecОшибка времени приводит к недействительности даже корректных данных.
const session = await Iron.unseal(cookie, password, options)
Используется для:
try {
const data = await Iron.unseal(token, password, options)
} catch (err) {
// обработка недействительного токена
}
Метод unseal является строго обратной операцией к
seal:
seal → преобразует объект в защищённую строкуunseal → восстанавливает исходный объектНесовместимость параметров между ними приводит к невозможности восстановления данных.
Современная реализация основана на Promise:
await.then()Iron.unseal(sealed, password, options)
.then(value => {
console.log(value)
})
.catch(err => {
console.error(err)
})