使用JWE或JWS的优缺点是什么?

时间:2015-11-08 00:19:50

标签: api security authorization access-token jwt

我正在尝试实现身份验证令牌系统,因此我想知道使用JSON Web加密(JWE)或JSON Web签名(JWS)的优缺点,以及是否有意义使用它们( JWS内部的JWE。)

3 个答案:

答案 0 :(得分:18)

JSON Web签名(JWS)声明使用签名进行签名,该签名可由服务器使用秘密签名密钥进行验证。这可确保在客户端和服务器之间传递声明时没有调整声明。 JWS令牌的内容是Base64编码的,未加密(记住编码与加密不同!)。 Base64编码数据看起来是加密的,因为它看起来像垃圾文本,但实际上很容易变回可读数据。因此,始终建议不要在JWT中包含任何敏感信息。建议仅在希望在双方之间(或在客户端和服务器之间)交换信息时才使用JWT,并且没有敏感数据作为令牌中的有效负载传递。

但是,如果您想在令牌中包含任何私人信息,该怎么办?您不希望敏感信息出现在只有Base64编码的令牌中,任何攻击者都可以轻松解码。幸运的是,有一种方法可以使用另一种加密和保护声明数据,这是一种更安全的保护级别,称为 JSON Web加密(JWE)。它定义了一种加密索赔数据的方法(基本上是基于JSON的数据结构),这样只有预期的接收者才能读取令牌中存在的信息。

处理网络令牌的最佳方式是

  • 签名,以便众所周知,令牌来自授权客户。
  • 对其进行加密,以便只有授权的服务器才能说出它的内容。

我们在Java中提供了几个可用于加密JSON Web令牌的好库:

  1. Jose4J
  2. Nimbus-JOSE-JWT
  3. 上述两个库都是JWT和JOSE(Javascript Object Signing and Encryption)规范套件的开源(Apache 2.0)实现。他们都是高质量的图书馆,你不能真正做出错误的选择。但是,JWT.IO有一个很好的UI来显示每个可用库的差异。

答案 1 :(得分:5)

JWS和JWE之间的目标不同。 JWS用于签署声明,JWE用于传输敏感数据。

如果要实施身份验证系统,则必须使用JWS来验证声明的真实性。

如果JWS中的某些声明包含敏感信息,您还可以使用JWE加密JWS。

但在你的上下文中只使用JWE是没有意义的。

答案 2 :(得分:4)

使用JWS对数据进行签名,使其受到完整性保护,这意味着:

  • 中间人攻击可以查看数据到底是什么
  • 中间人攻击无法对其进行修改,因为签名验证将失败

JWE用于加密数据并使其具有完整性保护

  • 中间人攻击无法查看数据到底是什么
  • 中间人攻击无法对其进行修改,因为验证将失败