Многоуровневые токены представляют собой механизм создания вложенных или производных ключей на основе одного исходного секрета. В контексте библиотеки Iron это достигается через последовательное применение криптографических операций: шифрования, подписи и деривации ключей. Основная цель — разграничение доступа и повышение безопасности без необходимости хранения множества независимых секретов.
Ключевая идея заключается в том, что один мастер-ключ используется для генерации токенов разных уровней, каждый из которых имеет собственные ограничения: время жизни, область применения и уровень доверия.
Мастер-токен — это первичный зашифрованный объект, созданный с
использованием основного пароля или ключа. В Iron он формируется с
помощью функции seal, которая объединяет:
const Iron = require('@hapi/iron');
const masterToken = await Iron.seal(
{ userId: 123, role: 'admin' },
password,
Iron.defaults
);
Особенности мастер-токена:
Производные токены создаются на основе уже существующего токена или его расшифрованного содержимого. Они используются для делегирования ограниченных прав.
Процесс:
unseal)const data = await Iron.unseal(masterToken, password, Iron.defaults);
const limitedToken = await Iron.seal(
{ userId: data.userId, scope: 'read-only' },
password,
{ ...Iron.defaults, ttl: 60000 }
);
Назначение:
На этом уровне токены становятся максимально специализированными. Они могут включать:
const ephemeralToken = await Iron.seal(
{
action: 'download',
fileId: 456,
nonce: crypto.randomUUID()
},
password,
{ ...Iron.defaults, ttl: 5000 }
);
Ключевые свойства:
Для повышения безопасности рекомендуется использовать разные ключи для разных уровней. Вместо одного пароля применяется схема деривации:
const crypto = require('crypto');
function deriveKey(baseKey, context) {
return crypto
.createHmac('sha256', baseKey)
.update(context)
.digest('hex');
}
const level1Key = deriveKey(masterPassword, 'level1');
const level2Key = deriveKey(masterPassword, 'level2');
Преимущества:
Каждый уровень токена может иметь собственный TTL:
Iron автоматически встраивает метку времени и проверяет её при
unseal.
const options = {
...Iron.defaults,
ttl: 30000 // 30 секунд
};
При попытке расшифровки просроченного токена будет выброшена ошибка.
Возможна ситуация, когда один токен содержит другой:
const nestedToken = await Iron.seal(
{ session: masterToken, permissions: limitedToken },
password,
Iron.defaults
);
Сценарии применения:
Каждый токен в Iron содержит:
Это означает, что изменение любого уровня вложенности приводит к ошибке при расшифровке.
Многоуровневость можно реализовать не только через разные токены, но и через структуру внутри одного:
{
user: {
id: 123,
roles: ['admin']
},
access: {
api: true,
adminPanel: false
}
}
Затем на основе этих данных создаются разные токены с разными подмножествами информации.
1. Аутентификация + делегирование
2. Временные ссылки
fileId и TTL3. Микросервисная архитектура
4. Zero-trust системы
Использование одного ключа для всех уровней → повышает риск компрометации
Слишком длинный TTL → увеличивает окно атаки
Передача лишних данных → утечка чувствительной информации
Отсутствие nonce → возможность повторного использования токена
Многоуровневые токены увеличивают нагрузку из-за частых операций шифрования. Методы оптимизации:
| Характеристика | Iron | JWT |
|---|---|---|
| Шифрование | Да | Обычно нет |
| Подпись | Да | Да |
| Многоуровневость | Гибкая | Ограниченная |
| Контроль TTL | Встроенный | Через claims |
| Безопасность данных | Высокая | Зависит от реализации |
Многоуровневые токены можно комбинировать с:
Уровни можно формализовать:
| Уровень | Назначение | TTL | Ключ |
|---|---|---|---|
| L1 | Сессия | 24 часа | masterKey |
| L2 | API доступ | 5 минут | apiDerivedKey |
| L3 | Одноразовые действия | 10 секунд | ephemeralKey |
Iron не хранит состояние, поэтому отзыв токена реализуется через:
Каждый уровень токена может включать:
{
traceId: 'abc123',
issuedAt: Date.now()
}
Это позволяет отслеживать цепочку действий пользователя через разные уровни доступа.
Многоуровневые токены позволяют:
За счёт криптографической изоляции каждого уровня достигается баланс между безопасностью и удобством архитектуры.