Повторное использование ключевого материала: когда допустимо

В Web Crypto API ключевой материал представляет собой основу всей криптографической безопасности: именно он определяет, какие данные могут быть зашифрованы, расшифрованы, подписаны или проверены. Повторное использование ключей — тема, в которой важно различать корректные сценарии эксплуатации и ситуации, где повтор приводит к компрометации безопасности.

Ключи в WebCrypto инкапсулированы внутри объекта CryptoKey, и напрямую доступ к их значению невозможен. Однако логика их применения зависит не от “видимости” ключа, а от криптографического контекста: алгоритма, режима работы и назначения.

Базовый принцип разделения: ключ ≠ параметр использования

Ключевой материал может использоваться многократно, если выполняются два условия:

  • алгоритм допускает многократное применение одного ключа
  • параметры операции остаются уникальными там, где это требуется (например, IV или nonce)

Классическая ошибка заключается в смешивании этих понятий: ключ считается «одноразовым», хотя в большинстве случаев одноразовыми должны быть только вспомогательные значения.


Симметричные ключи: когда повтор допустим

Симметричные ключи (AES, HMAC) являются наиболее частым примером безопасного повторного использования.

AES-GCM и AES-CBC

В случае AES-GCM ключ можно использовать многократно для шифрования разных сообщений:

  • один и тот же ключ допустим для множества операций
  • критически важно: уникальный nonce (IV) для каждого шифрования

Нарушение этого правила приводит к утечке информации о plaintext и потенциальному восстановлению ключа.

Пример корректной модели использования:

  • ключ один
  • nonce генерируется заново для каждого сообщения
  • дополнительный связанный контекст (AAD) может повторяться без угрозы

Для AES-CBC ситуация более строгая:

  • ключ также может повторно использоваться
  • IV обязательно должен быть случайным и уникальным
  • повтор IV при одном ключе приводит к утечке шаблонов данных

Таким образом, повтор ключа допустим, но повтор параметров режима — нет.


HMAC: полностью безопасное повторное использование

Для HMAC ключ используется многократно без ограничений:

  • один ключ может применяться к неограниченному числу сообщений
  • результат зависит только от входных данных
  • повторное использование ключа — нормальная и ожидаемая практика

Это одна из причин, почему HMAC часто применяется для аутентификации сообщений и токенов.


Асимметричные ключи: устойчивость к повтору

Асимметричные ключевые пары (RSA, ECDSA, ECDH) по своей природе рассчитаны на многократное использование.

Подпись (RSA-PSS, ECDSA)

Ключ подписи:

  • создаётся один раз
  • используется для множества подписей
  • безопасен при повторном применении без ограничения количества операций

Однако важен контекст:

  • при ECDSA критически важна случайность внутреннего nonce (k)
  • слабая реализация генерации nonce приводит к утечке приватного ключа, даже если сам ключ используется «правильно»

Таким образом, проблема не в повторе ключа, а в повторе или предсказуемости внутреннего случайного значения алгоритма.


Шифрование (RSA-OAEP)

Публичный ключ RSA-OAEP может использоваться многократно:

  • повторное использование безопасно
  • ограничение связано не с ключом, а с размером данных и padding-режимом

Приватный ключ также может применяться многократно для расшифровки без деградации безопасности.


ECDH: повторяемость как часть модели

В ECDH ключи часто используются в множестве сессий:

  • один приватный ключ может участвовать в создании множества shared secret
  • каждый обмен формирует уникальный результат за счёт разных публичных ключей собеседников

Повтор ключа здесь — нормальная практика, а уникальность достигается за счёт комбинации ключевых пар.


Ключи как материал для деривации

Важный сценарий повторного использования — применение ключа как исходного материала для производных ключей.

HKDF и PBKDF2

Через deriveKey или deriveBits один ключ может использоваться как вход:

  • HKDF позволяет безопасно получать множество независимых ключей из одного исходного
  • PBKDF2 применяется для паролей и может повторно использовать один и тот же парольный материал

Принцип здесь следующий:

  • исходный ключ не используется напрямую в криптографии данных
  • он служит источником энтропии
  • производные ключи считаются независимыми

Это один из самых безопасных видов «повторного использования», поскольку он не нарушает изоляцию данных.


Когда повторное использование становится опасным

Повтор ключа допустим, но есть категории ошибок, где повтор приводит к критическим уязвимостям.

Повтор nonce / IV

Наиболее распространённая ошибка:

  • один ключ AES-GCM + повторяющийся nonce
  • один ключ AES-CBC + повторяющийся IV

Последствия:

  • утечка структуры сообщений
  • возможность восстановления XOR между plaintexts
  • в некоторых случаях — восстановление ключа

Ключ может быть стабильным, но параметры операции должны быть уникальными.


Повтор ключа в разных режимах с разными ожиданиями

Использование одного ключа для:

  • шифрования (AES-GCM)
  • и аутентификации (HMAC)

может быть допустимо, но архитектурно нежелательно:

  • увеличивается риск перекрёстных атак
  • нарушение принципа разделения ключей по назначению

Практика безопасной криптографии требует разделения ключей по функциям даже при одинаковом исходном материале.


Повтор ключа в контексте ошибок реализации RNG

Особая категория риска:

  • генерация ключей через слабый источник случайности
  • повторное использование одного и того же seed
  • детерминированная генерация ключей без необходимости

В таких случаях проблема не в повторе, а в отсутствии энтропии.


Экспорт и импорт ключей: скрытый канал повторного использования

WebCrypto позволяет:

  • экспортировать ключ (exportKey)
  • импортировать его обратно (importKey)

Это создаёт сценарий повторного использования ключевого материала между:

  • сессиями
  • устройствами
  • различными частями приложения

Допустимо при соблюдении условий:

  • ключ передаётся в защищённом виде (например, через wrapping)
  • используется безопасный формат (JWK, raw, spki, pkcs8)
  • не происходит дублирования ключа без необходимости

Ключи обёртки (key wrapping)

Отдельный класс — ключи, предназначенные для шифрования других ключей:

  • AES-KW
  • RSA-OAEP для wrapping

Здесь повторное использование ключа — нормальная эксплуатационная модель:

  • один wrapping key используется для множества ключей данных
  • ключи данных регулярно обновляются
  • wrapping key имеет более длительный жизненный цикл

Жизненный цикл ключа и стратегия повторного использования

Повтор ключа всегда рассматривается в контексте его жизненного цикла:

  • генерация
  • использование
  • ротация
  • уничтожение (CryptoKey может быть логически выведен из обращения)

Рациональная стратегия:

  • долгоживущие ключи (подпись, wrapping)
  • среднесрочные ключи (ECDH сессии)
  • краткоживущие ключи (AES для сообщений)

Повторное использование допустимо в пределах выбранного жизненного цикла, но не должно выходить за его границы.


Практическое правило криптографической устойчивости

Ключевой материал может использоваться повторно, если:

  • он не раскрывается
  • не используется с повторяющимися параметрами (nonce/IV)
  • не нарушает разделение ролей
  • не выходит за пределы своего жизненного цикла
  • не является результатом слабой генерации

Повторение ключа — нормальная модель WebCrypto, тогда как повтор вспомогательных параметров — основная причина криптографических инцидентов.