嵌套JWS + JWE与带有身份验证加密的JWE

时间:2017-10-26 15:29:39

标签: encryption jwt encryption-asymmetric jwe message-authentication-code

问题

我想在我的服务器(可信环境)上签名并加密(有效地,混淆)某些信息('令牌')并将密文发送到客户端计算机(不太可靠的环境)以供我的读取和验证客户端软件。这种类型的环境允许我在服务器上使用私钥进行非对称签名,但是我无法在客户端“隐藏”用于对称签名的密钥。

替代

我选择使用JWT作为标准,Nimbus JOSE+JWT library作为签名和加密的实现。 Nimbus库为sign + encrypt提供了两个选项:将JWS嵌套到JWE中或使用带有认证加密算法的JWE(A128CBC_HS256,A192CBC_HS384或A256CBC_HS512)。 Algorithm Selection Guide for Nimbus州:

  

JOSE中的加密始终经过身份验证,这意味着可以保护密文的完整性不被篡改。因此,经过身份验证的加密使得在JSON Web加密(JWE)冗余中嵌套HMAC JWT;仅使用JWE加密。

但是,AxxxCBC_HSxxx加密方法仅使用对称密钥。此外,用RSA JWE算法替换直接JWE算法也无济于事,因为滥用者可以自己生成CEK(由HMAC的加密密钥和密钥组成)并使用公钥对其进行加密。

问题

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

1 个答案:

答案 0 :(得分:1)

澄清

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

你是对的,与AxxxGCM算法相反,AxxxCBC算法不是经过身份验证的加密算法。 但是,RFC7516 section 5.1 item 15.(JWE规范)引入了一个标记,允许对密文进行身份验证并保护受保护标头的完整性(这就是AxxxCBC算法与HSxxx一起使用的原因)。

这由RFC7518 section 5.1中的表格确认。详细信息将在下一节中给出。

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

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

答案

您表示您需要签名并加密,但您无法在客户端隐藏密钥,因此无法保证签名。

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