问题
我希望在我的服务器(受信任的环境)上对某些信息(“令牌”)进行签名和加密(实际上是混淆),并将密码文本发送到客户端计算机(不完全可信的环境),由我的客户端软件读取和验证。这种类型的环境允许我在服务器上拥有一个用于非对称签名的私钥,但我不能在客户端“隐藏”用于对称签名的密钥。
替代品
我选择使用JWT作为标准,使用Nimbus JOSE+JWT库作为签名和加密的实现。尼姆布斯库为签名+加密提供了两个选项:将JWS嵌套到JWE或使用JWE与经过身份验证的加密算法(A128CBC_HS256、A192CBC_HS384或A256CBC_HS512)。Nimbus算法选择指南声明:
JOSE中的加密总是经过身份验证的,这意味着密文的完整性受到保护,不会被篡改。因此,通过身份验证的加密使得在JSON加密( JWE )中嵌套HMAC JWT是多余的;只使用JWE加密即可。
但是,AxxxCBC_HSxxx加密方法只使用对称密钥。此外,用RSA JWE算法代替直接JWE算法也没有帮助,因为滥用者可以自己生成CEK (由加密密钥和HMAC密钥组成),并使用公钥对其进行加密。
问题
尽管引用了嵌套JWT的冗余性,但我的结论是,就我的情况而言,JWE+JWS嵌套是唯一可行的方法。我说的对吗?
发布于 2017-10-27 08:14:05
澄清
每个内容加密算法(AxxxGCM和AxxxCBC_HSxxx)都使用对称密钥(CEK)。该密钥由密钥加密算法及其密钥管理模式(随机密钥、密钥协商、直接密钥.)决定。
你是对的,与AxxxGCM算法相反,AxxxCBC算法不是认证加密算法。但是,RFC7516第5.1节第15项。 (JWE规范)引入了一个标记,允许对加密文本进行身份验证并保护受保护的头部的完整性(这就是为什么AxxxCBC算法与HSxxx一起使用的原因)。
RFC7518 5.1节中的表证实了这一点。详情见下一节。
在任何情况下,您都需要2种JWE计算算法:
RSA或ECDH-ES算法。AxxxGCM或AxxxCBC_HSxxx算法。使用JWE规范,两者都提供了经过身份验证的加密。就我个人而言,我更喜欢AxxxGCM算法,因为它们在我的环境中更快。回答
您表示要签名和加密,但无法在客户端隐藏秘密密钥,因此签名将无法得到保证。
如果您只加密(仅限JWE),则您的服务器将无法验证令牌的颁发者。
https://stackoverflow.com/questions/46958289
复制相似问题