1

问题

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

备择方案

我选择使用 JWT 作为标准,使用Nimbus JOSE+JWT 库作为签名和加密的实现。Nimbus库为签名 + 加密提供了两个选项:将 JWS 嵌套到 JWE 或将 JWE 与经过身份验证的加密算法(A128CBC_HS256、A192CBC_HS384 或 A256CBC_HS512)一起使用。Nimbus 算法选择指南指出:

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

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

问题

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

4

1 回答 1

2

澄清

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

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

RFC7518 第 5.1 节中的表格证实了这一点。下一节将给出详细信息。

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

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

回答

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

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

于 2017-10-27T08:14:05.213 回答