Вложенные 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), ваш сервер не сможет проверить эмитента токена.