嵌套的 JWS + JWE 与经过身份验证的加密的 JWE

Nested JWS + JWE vs JWE with Authenticated Encryption

问题

我想在我的服务器(受信任的环境)上签名和加密(有效地混淆)一些信息 ('token') 并将密文发送到客户端机器(不太受信任的环境)以供读取并由我的客户端软件验证。这种类型的环境允许我在服务器上拥有用于非对称签名的私钥,但我不能 'hide' 用于客户端对称签名的密钥。

备选方案

我选择使用 JWT 作为标准,Nimbus JOSE+JWT library as an implementation for signing and encryption. Nimbus library provides two options for sign + encrypt: nest JWS into JWE or use JWE with authenticated encryption algorithm (A128CBC_HS256, A192CBC_HS384, or A256CBC_HS512). Algorithm Selection Guide for Nimbus 声明:

Encryption in JOSE is always authenticated, meaning that ciphertext’s integrity is protected from tampering. Authenticated encryption thus makes nesting an HMAC JWT inside a JSON Web Encryption (JWE) redundant; use just JWE encryption.

但是,AxxxCBC_HSxxx 加密方法仅使用对称密钥。此外,用 RSA JWE 算法替换直接 JWE 算法应该没有帮助,因为滥用者可以自己生成 CEK(由加密密钥和 HMAC 密钥组成)并使用 public 密钥对其进行加密。

问题

尽管有关于嵌套 JWT 冗余的引用,但我得出结论,对于我的案例,JWE+JWS 嵌套是唯一可行的方法。我说的对吗?

澄清

每个内容加密算法(AxxxGCMAxxxCBC_HSxxx)都使用对称密钥(CEK)。这个密钥是由密钥加密算法及其密钥管理方式(随机CEK、密钥协商、直接密钥...)决定的。

你是对的,与AxxxGCM算法相反,AxxxCBC算法不是认证加密算法。 但是,RFC7516 section 5.1 item 15.(JWE 规范)引入了一个标签,允许验证密文并保护受保护 header 的完整性(这就是 AxxxCBC 算法与 HSxxx).

RFC7518 section 5.1中的table证实了这一点。下一节将详细介绍。

在任何情况下,您都需要 2 个 JWE 计算算法:

  • 密钥加密算法:您提到您有一个非对称密钥,所以我猜您会根据您的密钥类型选择 RSAECDH-ES 算法。
  • 内容加密密钥:AxxxGCMAxxxCBC_HSxxx 算法。 JWE 规范都提供经过身份验证的加密。我个人更喜欢 AxxxGCM 算法,因为它们在我的环境中速度更快。

回答

您表示要签名和加密,但您不能在客户端隐藏密钥,因此不能保证签名。

如果您只加密(仅限 JWE),您的服务器将无法验证令牌的颁发者。