我正在尝试实现身份验证令牌系统,因此我想知道使用JSON Web加密(JWE)或JSON Web签名(JWS)的优缺点,以及是否有意义使用它们( JWS内部的JWE。)
答案 0 :(得分:18)
JSON Web签名(JWS)声明使用签名进行签名,该签名可由服务器使用秘密签名密钥进行验证。这可确保在客户端和服务器之间传递声明时没有调整声明。 JWS令牌的内容是Base64编码的,未加密(记住编码与加密不同!)。 Base64编码数据看起来是加密的,因为它看起来像垃圾文本,但实际上很容易变回可读数据。因此,始终建议不要在JWT中包含任何敏感信息。建议仅在希望在双方之间(或在客户端和服务器之间)交换信息时才使用JWT,并且没有敏感数据作为令牌中的有效负载传递。
但是,如果您想在令牌中包含任何私人信息,该怎么办?您不希望敏感信息出现在只有Base64编码的令牌中,任何攻击者都可以轻松解码。幸运的是,有一种方法可以使用另一种加密和保护声明数据,这是一种更安全的保护级别,称为 JSON Web加密(JWE)。它定义了一种加密索赔数据的方法(基本上是基于JSON的数据结构),这样只有预期的接收者才能读取令牌中存在的信息。
处理网络令牌的最佳方式是:
我们在Java中提供了几个可用于加密JSON Web令牌的好库:
上述两个库都是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用于加密数据并使其具有完整性保护