Краткий ответ
Когда необходимо подписать и зашифровать, вы должны сначала подписать сообщение, а затем зашифровать результат. То есть вложение JWS в JWE является правильным подходом.
Длинный ответ
JSON Web Token (JWT) - это открытый стандарт, определяющий компактный и автономный способ безопасной передачи информации между сторонами в виде объекта JSON. JWT - это универсальное имя для следующих типов токенов:
JSON Web Signature (JWS): полезная нагрузка закодирована и подписана , поэтому можно проверить целостность заявок.
JSON Web Encryption (JWE): их полезная нагрузка зашифрована , поэтому заявки скрыты от других сторон.
Изображение было извлечено с этой страницы .
JWT позволяет явно подписывать и шифровать токен (JWS и JWE) или вкладывать JWS в JWE (вложенный JWE).
Хотя оба подхода кажутся мне разумными, существует ли «стандартный» способ сделать это? Я не нашел никаких подробностей по этому вопросу.
Понятие вложенного JWT определено в RFC 7519 :
JWT, в котором используются вложенные подпись и / или шифрование. В
Вложенные JWT, JWT используется в качестве значения полезной нагрузки или открытого текста
ограждающая структура JWS или JWE соответственно.
Что касается порядка операций, рекомендуется сначала подписать сообщение, а затем зашифровать результат , как указано в том же документе:
11,2. Заказ на подпись и шифрование
Синтаксически операции подписи и шифрования для Вложенные
JWT могут применяться в любом порядке, если подпись и шифрование
необходимо, обычно производители должны подписать сообщение, а затем
зашифровать результат (тем самым зашифровав подпись). Это мешает
атаки, при которых подпись снимается, оставляя только зашифрованный
сообщение, а также обеспечение конфиденциальности для подписавшего. Более того,
подписи зашифрованного текста не считаются действительными во многих
юрисдикции.