Библиотека Iron используется для «запечатывания» (sealing) и последующего восстановления (unsealing) данных с применением криптографической защиты. В отличие от простой подписи, Iron объединяет шифрование и контроль целостности, обеспечивая одновременно конфиденциальность и защиту от модификации.
Ключевая идея заключается в построении детерминированного криптографического контура, где входные данные преобразуются в безопасную строку с использованием набора параметров: алгоритма шифрования, механизма HMAC, соли, количества итераций и пользовательского пароля.
Настройка алгоритма подписи в Iron опирается на несколько фундаментальных параметров:
password — базовый секрет, от которого зависит вся стойкость схемы algorithm — алгоритм симметричного шифрования integrity — алгоритм контроля целостности (HMAC) salt — случайная строка для усиления устойчивости к атаке по словарю iterations — количество итераций для ключевого деривационного алгоритма ttl — время жизни зашифрованного сообщения
Каждый из этих параметров влияет на итоговую криптографическую стойкость и совместимость между сервисами.
Базовая конфигурация передается через объект параметров при вызове функций seal/unseal.
import Iron from '@hapi/iron';
const options = {
password: 'strong_password_value',
algorithm: 'aes-256-cbc',
integrity: 'sha256',
salt: 'unique_salt_value',
iterations: 10000,
ttl: 60 * 60 * 1000
};
Внутри Iron эти параметры используются для построения ключей шифрования и подписи, что обеспечивает согласованность между процессами кодирования и декодирования.
Пароль в Iron не является просто строкой аутентификации. Он используется как первичный источник энтропии для генерации ключей.
Слабый пароль приводит к возможности восстановления данных через перебор. Сильный пароль должен обладать:
Пароль влияет как на шифрование, так и на HMAC, что делает его центральным элементом всей схемы безопасности.
Iron использует симметричное шифрование, чаще всего AES. В
конфигурации это задается через параметр algorithm.
algorithm: 'aes-256-cbc'
Важно учитывать, что смена алгоритма делает невозможным расшифровку ранее зашифрованных данных без сохранения совместимых параметров.
Параметр integrity отвечает за контроль неизменности
данных.
integrity: 'sha256'
HMAC применяется к зашифрованному содержимому и параметрам, формируя криптографическую подпись. При расшифровке происходит повторное вычисление значения и сравнение.
Используемые алгоритмы:
Выбор алгоритма влияет на производительность и устойчивость к атакам подмены.
Соль используется для предотвращения атак с использованием радужных таблиц и ускоренных методов подбора ключей.
salt: 'unique_application_salt'
Соль должна быть:
Изменение соли приводит к невозможности расшифровки ранее созданных данных.
Параметр iterations управляет количеством повторений
функции деривации ключа (PBKDF2 внутри реализации Iron).
iterations: 10000
Чем выше значение:
Практический диапазон:
Iron включает версионирование формата зашифрованной строки. Это позволяет различать схемы шифрования при обновлении параметров.
При изменении:
необходимо учитывать, что старые данные могут остаться расшифровываемыми только при сохранении обратной совместимости конфигурации.
import Iron from '@hapi/iron';
const config = {
password: process.env.IRON_PASSWORD,
algorithm: 'aes-256-cbc',
integrity: 'sha256',
salt: process.env.IRON_SALT,
iterations: 20000,
ttl: 24 * 60 * 60 * 1000
};
const data = {
userId: 42,
role: 'admin'
};
const sealed = await Iron.seal(data, config.password, config);
const unsealed = await Iron.unseal(sealed, config.password, config);
Неправильная настройка алгоритма подписи приводит к типичным проблемам:
Несовпадение параметров
Слабый пароль
Слишком низкие итерации
Изменение соли
Несогласованный integrity алгоритм
Стабильная настройка алгоритма подписи строится на неизменности критических параметров и контролируемом обновлении некритических.
Критические параметры:
Изменение этих параметров требует стратегии миграции данных, иначе ранее зашифрованные объекты становятся недоступными.
Некритические параметры: