Вложенные JWS + JWE против JWE с аутентифицированным шифрованием

проблема

Я хочу подписать и зашифровать (эффективно замаскировать) некоторую информацию ("токен") на моем сервере (в доверенной среде) и отправить зашифрованный текст на клиентский компьютер (не совсем доверенную среду) для чтения и проверки на стороне клиента. программного обеспечения. Этот тип среды позволяет мне иметь на сервере закрытый ключ для асимметричной подписи, но я не могу "скрыть" секретный ключ для симметричной подписи на стороне клиента.

альтернативы

Я решил использовать JWT в качестве стандарта и библиотеку Nimbus JOSE+JWT в качестве реализации для подписи и шифрования. Библиотека Nimbus предоставляет две опции для sign + encrypt: вложение JWS в JWE или использование JWE с аутентифицированным алгоритмом шифрования (A128CBC_HS256, A192CBC_HS384 или A256CBC_HS512). Руководство по выбору алгоритма для состояний Nimbus:

Шифрование в JOSE всегда проходит проверку подлинности, что означает, что целостность зашифрованного текста защищена от взлома. Таким образом, аутентифицированное шифрование делает избыточным размещение JMT HMAC внутри JSON Web Encryption (JWE); используйте только шифрование JWE.

Однако в методах шифрования AxxxCBC_HSxxx используются только симметричные ключи. Кроме того, замена прямого алгоритма JWE на алгоритм RSA JWE не должна помочь, поскольку злоумышленник может самостоятельно генерировать CEK (состоящий из ключа шифрования и ключа для HMAC) и шифровать его с помощью открытого ключа.

Вопрос

Несмотря на цитату о избыточности вложенных JWT, я пришел к выводу, что для моего случая вложение JWE+JWS - единственный работоспособный подход. Я прав?

1 ответ

Решение

Разъяснения

Каждый алгоритм шифрования контента (AxxxGCM а также AxxxCBC_HSxxx) используйте симметричный ключ (CEK). Этот ключ определяется алгоритмом шифрования ключа и его режимом управления ключами (случайный CEK, согласование ключа, прямой ключ...).

Вы правы, вопреки AxxxGCM алгоритмы, AxxxCBC алгоритмы не являются аутентифицированными алгоритмами шифрования. Тем не менее, в разделе 15 RFC7516, пункт 15 (спецификация для JWE) вводится тег, который позволяет аутентифицировать шифротекст и защищать целостность защищенного заголовка (поэтому AxxxCBC Алгоритм используется с HSxxx).

Это подтверждается таблицей в разделе 5.1 RFC7518. Подробности приведены в следующем разделе.

В любом случае вам понадобятся 2 алгоритма для вычисления JWE:

  • Алгоритм шифрования ключа: вы упомянули, что у вас есть асимметричный ключ, поэтому я думаю, что вы выберете RSA или ECDH-ES алгоритм в зависимости от вашего типа ключа.
  • Ключ шифрования содержимого: AxxxGCM или же AxxxCBC_HSxxx алгоритмы. Со спецификацией JWE оба предлагают аутентифицированное шифрование. Лично я предпочитаю AxxxGCM алгоритмы, потому что они быстрее в моей среде.

Ответ

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

Если вы только шифруете (только JWE), ваш сервер не сможет проверить эмитента токена.

Другие вопросы по тегам