JSON Web令牌-为什么有效载荷是公开的?


30

我无法理解将base64解码后使JWT的索偿/净荷公开可见的原因。

为什么?

用秘密对它进行加密似乎会更加有用。

有人可以解释为什么或在什么情况下公开此数据很有用吗?


当您编写JWT时,您可能是指JWS。因为JWE(也是JWT的“子类”)实际上是对其内容加密。
Alexey

Answers:


28

您选择不加密有效负载的原因与您选择不加密任何其他内容的原因相同:成本(无论多么小)都超过了收益,并且不需要以这种方式保护很多数据。

您最需要防止的是人们篡改数据,以便更新错误的记录,或者某人的支票帐户从其中获得的钱本来应该没有。JSON Web令牌的签名可以实现这一点,因为更改标头/有效负载/签名组合的任何部分都会使数据包无效。

请注意,您仍然可以使用SSL在传输层保护数据包。


嗯,我知道,因此JWT本质上是一个新的CSRF令牌。感谢您的解释,它消除了混乱。
ineedhelp

6
没有JWT不是新的CSRF令牌。那是两件事。
Ash Ash

@ash如果操作的详细信息存储在JWT中并在服务器上进行了验证,那么在这种情况下JWT实质上不是CSRF预防的角色吗?我了解香草JWT的主要目的是身份验证,从这个答案中可以很清楚地看出。我想我正在想象添加更多数据并一次完成两件事。
ineedhelp

@RobertHarvey,您使用的JWT不正确。JST是JWS和JWE的“伞形”术语。JWS是认证,JWE是加密。因此,“ JSON Web令牌的目的是进行身份验证”实际上应该是“ JWS进行身份验证”。
阿列克谢

@Alexey:我的回答略有改动以适应。
罗伯特·哈维

4

RFC中术语签名的使用类似于非对称密码学中的数字签名。在非对称加密中,如果发件人使用其私钥加密消息,则拥有该消息的任何人都可以使用发件人的公钥对其进行解密。因此,使用“ 签名 ”一词的目的不是要保留消息的秘密,而是要验证消息的完整性/发送者,这一点并未更改。

对于JWT,发送系统既是消息的创建者又是消息的使用者(请参见下图),并且目标是确保传递给用户的令牌不被篡改(例如,赋予较高的特权)。

正如@Robert所提到的,JWT可以/仍应该使用TLS加密。

这是对JWT和签名的很好的解释,下面的图像源自这些JWT和签名。理解JSON Web令牌(JWT)的5个简单步骤

asdfasdf


2

要添加到Robert Harveys的答案中,对有效负载进行加密有一个很大的缺点-这意味着服务的接收者需要与身份验证服务器(加密密钥)共享一个秘密,以了解令牌的持有者是否已被授权或不。相反,任何人都只能使用认证服务器发布的公钥来验证JWT。

这是openid connect规范的关键部分,因为它允许客户端应用程序验证由auth服务器发出的身份令牌,它还使部署资源服务器变得更加容易(因为不需要通过秘密加密来进行部署)键),并且在尝试诊断已发布的JWT的任何问题时也有帮助。


您正在尝试比较非对称和对称加密机制,jwt是RSA加密的实现。
TheAnimatrix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.