В основе библиотеки лежит концепция упаковки (sealing) и распаковки (unsealing) данных с использованием единственного секретного пароля. Такой подход применяется, когда необходимо передавать или хранить данные в недоверенной среде, сохраняя их целостность и конфиденциальность без построения полноценной инфраструктуры ключей.
Однопарольная модель означает, что все операции выполняются на базе одного общего секрета, который используется для генерации криптографических ключей, защиты целостности и шифрования полезной нагрузки.
Процесс формирования защищённого объекта в Iron включает несколько этапов:
Результатом становится строка, которую можно безопасно передавать через URL, cookies или хранить в базе данных.
В типичном сценарии используется два основных метода: упаковка и распаковка данных.
import Iron from '@hapi/iron';
const password = 'super-secure-password';
const data = {
userId: 42,
role: 'admin'
};
const sealed = await Iron.seal(data, password, Iron.defaults);
const unsealed = await Iron.unseal(sealed, password, Iron.defaults);
В данном примере:
seal превращает объект в защищённую строкуunseal восстанавливает исходные данныеIron.defaults задаёт стандартные параметры
криптографииСформированная строка содержит несколько логических частей:
Эта структура позволяет библиотеке корректно интерпретировать данные даже при изменении внутренних реализаций алгоритмов.
Iron позволяет тонко управлять уровнем защиты через конфигурационный объект.
Ключевые параметры:
encryption — алгоритм симметричного шифрованияintegrity — алгоритм проверки целостностиsaltBits — размер солиiterations — количество итераций PBKDF2minPasswordLength — минимальная длина пароляПример настройки:
const options = {
encryption: 'aes-256-cbc',
integrity: 'sha256',
saltBits: 256,
iterations: 100000
};
Использование усиленных параметров увеличивает криптостойкость, но влияет на производительность операций упаковки и распаковки.
Однопарольная модель опирается на PBKDF2-деривацию ключей. Один и тот же пароль преобразуется в несколько независимых ключей:
Это обеспечивает разделение криптографических обязанностей даже при наличии одного входного секрета.
Подход эффективен в системах, где требуется:
Пример использования в cookie-сессиях:
const session = {
userId: 123,
scope: ['read', 'write']
};
const cookieValue = await Iron.seal(session, password, Iron.defaults);
На стороне сервера значение может быть восстановлено без обращения к базе данных.
Одним из ключевых механизмов является HMAC-подпись. Даже минимальное изменение зашифрованной строки приводит к невозможности её расшифровки.
Это обеспечивает защиту от:
При попытке расшифровать некорректные данные библиотека выбрасывает исключения. Основные причины ошибок:
Пример обработки:
try {
const data = await Iron.unseal(token, password, Iron.defaults);
} catch (err) {
// токен недействителен или повреждён
}
Несмотря на удобство, модель имеет ограничения:
Поэтому в крупных системах часто применяются дополнительные уровни абстракции: ротация секретов, разделение окружений, аппаратные хранилища ключей.
Процесс упаковки и распаковки включает криптографически дорогие операции:
На практике это означает:
Iron использует версионный формат строки, что позволяет:
Каждый sealed-объект содержит метку версии, определяющую способ его обработки.
Однопарольный подход часто применяется как замена серверных сессий. В этом случае состояние пользователя полностью хранится на клиенте в зашифрованном виде.
Типовая структура:
{
userId,
permissions,
issuedAt,
expiresAt
}
При каждом запросе данные распаковываются и валидируются.
Изменение пароля приводит к невозможности расшифровки ранее созданных данных, так как ключи генерируются детерминированно из исходного секрета.
Для поддержки миграции обычно вводятся стратегии:
При корректной настройке Iron обеспечивает защиту от:
Слабым местом остаётся человеческий фактор — выбор пароля и управление секретами.
Сгенерированная строка безопасна для:
Её структура не зависит от платформы, что делает механизм пригодным для распределённых систем.
В микросервисных системах однопарольный подход позволяет:
При этом важно обеспечить единый источник секретов во всех сервисах, иначе проверка данных станет невозможной.