【发布时间】:2016-02-08 22:21:48
【问题描述】:
我正在尝试实现身份验证令牌系统,因此我想知道使用 JSON Web 加密 (JWE) 或 JSON Web 签名 (JWS) 的优缺点,以及同时使用这两者是否有意义(JWE在 JWS 中)。
【问题讨论】:
标签: api security authorization access-token jwt
我正在尝试实现身份验证令牌系统,因此我想知道使用 JSON Web 加密 (JWE) 或 JSON Web 签名 (JWS) 的优缺点,以及同时使用这两者是否有意义(JWE在 JWS 中)。
【问题讨论】:
标签: api security authorization access-token jwt
JSON Web 签名 (JWS) 声明使用可由服务器使用秘密签名密钥验证的签名进行签名。这确保了声明在客户端和服务器之间传递时没有被篡改。 JWS 令牌的内容是 Base64 编码的,未加密(记住编码不同于加密!)。 Base64 编码的数据看起来是加密的,因为它看起来像垃圾文本,但实际上转换回可读数据是微不足道的。因此,始终建议不要在 JWT 中存储任何敏感信息。仅当您想在两方(或客户端和服务器之间)交换信息并且没有敏感数据作为令牌中的有效负载传递时,才建议使用 JWT。
但是,如果您想在令牌中包含任何私人信息怎么办?您不希望您的敏感信息出现在仅 Base64 编码的令牌中,任何攻击者都可以轻松解码。幸运的是,有一种方法可以使用另一种更安全的保护级别来加密和保护索赔数据,称为 JSON Web 加密 (JWE)。它定义了一种加密您的声明数据(基本上是基于 JSON 的数据结构)的方法,以便只有预期的接收者才能读取令牌中存在的信息。
处理网络令牌的最佳方式是:
我们有几个很好的 Java 库可以加密您的 JSON Web 令牌:
上述两个库都是 JWT 和 JOSE(Javascript 对象签名和加密)规范套件的开源 (Apache 2.0) 实现。它们都是高质量的库,你不会真的做出错误的选择。但是,JWT.IO 有一个很好的 UI 可以显示每个可用库的差异。
【讨论】:
JWS 用于对数据进行签名,使其受到完整性保护,这意味着:
JWE 用于加密数据并使其受到完整性保护
【讨论】:
JWS 和 JWE 的目标不同。 JWS 用于签署声明,JWE 用于传输敏感数据。
如果要实现认证系统,则必须使用 JWS 来验证声明的真实性。
如果您的 JWS 中的某些声明包含敏感信息,您也可以使用 JWE 加密您的 JWS。
但是在你的上下文中只使用 JWE 是没有意义的。
【讨论】: