使用JSON Web Encryption(JWE)加密的安全令牌的发行者验证?

6
我一直在阅读JSON Web Encryption(JWE)规范,最新草案为08,因为我们正在考虑在我们的身份验证服务器中支持JSON Web Tokens(JWT)。
使用它定义的非对称加密方法,对称密钥(内容主密钥)使用接收者的公钥进行加密。这是有道理的,这样只有接收者可以解密它,并确信令牌是为他们而设计的。
通常我也希望看到一些证明令牌来自哪里的东西,例如使用发行者的私钥创建的签名,可以使用其公钥进行验证。然而,签名似乎也是从内容主密钥或接收者的公钥派生出来的,没有提及发行者的私钥。
没有这个,对我来说,就好像只要知道预期的令牌格式,任何拥有接收者公钥的人(即任何人)都可以生成有效的令牌;不仅仅是受信任的身份验证服务器。
我不是密码学专家(离得很远),所以我肯定在这里漏掉了一些东西。接收方如何验证来自受信任发行者的非对称加密令牌?
鉴于JSON Web Signatures(JWS)规范确实定义了使用发行者的私钥签名并可以使用其公钥进行验证的签名,我想知道的是JWE令牌的有效负载是否应该是JWS令牌?
1个回答

5
JWT当然允许嵌套负载。实际上,在规范中有一个具体的参考,其中cty(内容类型)头参数可以设置为JWT,以指示有效载荷实际上是另一个JWT。
因此,您最有可能创建一个JWE并将其包装在JWS中,使用您的私钥签名。这也似乎是此线程在JOSE邮件列表上得出的结论(或至少是一个解决方案)。还有另一个相关线程,涉及减少有效载荷大小的问题。总的来说,该邮件列表可能值得关注,因为这是规范背后的人们聚集的地方。

4
谢谢提供的参考资料。经过仔细阅读规范书的第10节后,我发现它也包含了关于此事的一些额外指导:“虽然在语法上,对于嵌套JWT来说签名和加密操作可以以任何顺序应用,但通常发送方应该先对消息进行签名,然后加密结果(从而加密签名)。这样可以防止攻击者剥离签名,只留下加密的消息,并为签名者提供隐私保护。此外,在许多司法管辖区中,加密文本上的签名被认为是无效的。” - Greg Beech
是的,我想这是有道理的,因为加密消息本身通过GCM或加密-然后-HMAC方案进行完整性保护。这与Mike Jones在邮件列表中提出的相反。在实现这些东西时总是有很多地方容易出错 :)。 - Shaun the Sheep
我需要在JAVA中解密JWE并提取claimset。有没有可以做到这一点的库? - user243655
最好先签名再加密。这样顺序可以将签名和内容一起加密。如果您签署了JWE,则可能会删除或替换签名,并且签名的发布者可以被识别。 - Spomky-Labs
这在某种程度上取决于上下文。如果您这样做,那么同样地,接收方可以解密令牌并将其重新加密给另一方,使其看起来像是发行者/签名者向他们发送了消息(潜在的转发)。如果JWT同时包含“iss”和“aud”声明,则接收方可以检查它既是预期的受众,也是签名者。 - Shaun the Sheep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接