В библиотеке Iron ключи играют центральную роль в процессе шифрования и расшифрования данных. В отличие от простого кодирования, здесь используется модель sealed data, где любой защищённый объект проходит через этапы сериализации, криптографического преобразования и упаковки с проверкой целостности.
Ключ в Iron — это не просто строка пароля. Это структурированный набор параметров, включающий:
Ключ в Iron формирует основу всей системы безопасности. Его качество напрямую определяет стойкость защищённых данных к подбору и криптоанализу.
Генерация ключей в Iron строится вокруг принципа детерминированного вывода криптографического материала из мастер-пароля. Основная задача — превратить слабый пользовательский секрет в устойчивый криптографический ключ фиксированной длины.
Процесс генерации включает следующие этапы:
Мастер-пароль должен обладать достаточной энтропией. В большинстве реализаций рекомендуется использовать минимум 32 байта случайных данных.
Iron применяет PBKDF2 (Password-Based Key Derivation Function 2), который преобразует пароль в ключ:
K = PBKDF2(P, S, c, dkLen)
где:
Сгенерированный поток байтов разделяется на несколько частей:
Это обеспечивает разделение ответственности: шифрование и проверка целостности не используют один и тот же секрет.
Готовый ключ сериализуется в структуру, которая может храниться в конфигурации или передаваться в runtime:
{
id: "v1",
encryption: "...",
integrity: "...",
algorithm: "aes-256-cbc",
salt: "...",
iterations: 100000
}
Управление ключами в Iron выходит за рамки простой генерации. Это жизненный цикл криптографического материала, включающий создание, хранение, ротацию и отзыв.
Ключи не должны храниться в открытом виде в коде. Основные практики:
Особое внимание уделяется предотвращению утечек через логирование.
Iron поддерживает концепцию множественных ключей. Это позволяет:
Каждый ключ имеет уникальный идентификатор kid.
При шифровании данные маркируются текущим активным ключом:
sealed.kid = "v3";
При расшифровке система выбирает соответствующий ключ из набора доступных.
Ротация — критически важный процесс в долгосрочной эксплуатации системы.
Система не требует немедленной миграции всех данных.
Типичная конфигурация ключей:
const keys = [
{
id: "v1",
password: process.env.KEY_V1,
algorithm: "sha256",
salt: "static-salt-1",
iterations: 100000
},
{
id: "v2",
password: process.env.KEY_V2,
algorithm: "sha256",
salt: "static-salt-2",
iterations: 200000
}
];
Последний элемент массива обычно считается активным.
Каждый зашифрованный объект содержит метаданные:
Это позволяет системе корректно расшифровывать данные даже спустя годы.
Пример структуры sealed-данных:
{
sealed: "...",
mac: "...",
iv: "...",
kid: "v2"
}
Помимо шифрования, Iron использует механизм MAC (Message Authentication Code), который защищает данные от модификации.
MAC = HMAC_{K_i}(ciphertext)
где:
Любое изменение байта приводит к невозможности расшифровки.
Ключевой фактор безопасности — энтропия источника.
Недопустимые практики:
Рекомендуемые подходы:
crypto.randomBytesВ системах с Iron ключи должны строго разделяться:
Перенос ключей между окружениями считается анти-паттерном.
Со временем увеличивается вычислительная мощность атакующих систем, поэтому параметры derivation должны усиливаться:
Изменение этих параметров требует создания нового ключа версии, а не модификации старого.
Типичные ошибки в использовании Iron:
Каждая из этих ошибок снижает устойчивость всей системы.
При корректной архитектуре потеря одного ключа не должна приводить к полной потере данных.
Для этого:
При удалении ключа с активной ролью расшифровка старых данных становится невозможной, что делает ротацию критически чувствительным процессом.
В высоконагруженных системах количество ключей может достигать десятков и сотен версий. Для оптимизации:
kidЭто снижает нагрузку на CPU при массовой расшифровке данных.
Iron сохраняет обратную совместимость через механизм версионных адаптеров. Каждая версия ключа может использовать:
Система выбирает корректный обработчик на основе метаданных sealed-объекта.