关于JWT有什么安全保障?

edd*_*yuk 8 c# oauth oauth-2.0 jwt

我正在使用JWT来生产和消费令牌.经过几周阅读规格和谷歌搜索,我仍然不明白:如果我可以在一台机器上生产它然后在另一台机器上打开它,那么令牌是什么?书面标记是否应该以某种方式加密?我正在使用System.IdentityModel.Tokens和创建令牌使用JwtSecurityTokenJwtSecurityTokenHandler.

有人可以请我指一个关于主题的重点文档,主要解释它的安全方面吗?

Dis*_*tum 23

JWT的前两个段未加密,因此任何在服务器上生成JWT并将其发送回客户端的应用程序都应通过SSL进行加密.这通常作为对登录请求的响应发送给用户,该请求应该通过SSL发送,因为它通常包含用户名和密码组合.发送到服务器的后续请求也应该通过SSL完成,因为无论您使用什么类型的令牌 - 无论是JWT还是其他 - 它都不应以未加密的形式显示到数据包嗅探,否则用户会话可能被劫持.

JWT的安全方面来自第三和最后一段.它是通过使用只有服务器知道的密钥对前两个段进行签名来生成的.当服务器生成的JWT作为经过身份验证的请求的一部分发送回该服务器时,服务器知道密钥,因此可以验证第三个段中的签名并使用该签名来确保前两个段未被修改由服务器签名.


Guv*_*nte 4

据我所知, 的 C# 实现JwtSecurityToken并不是为了加密其内容而设计的(正如您的问题似乎暗示的那样)。相反,它旨在对其内容进行签名。这符合令牌的典型安全模型。它应该是一条以其他方式受到保护的信息。

区别在于,您并不是试图隐藏任何信息,您只是验证信息的来源(以及完整性,但这是相关的)。

例如,Twitter 可以给您一个包含数据“eddyuk”、“eddyuk 很棒的应用程序”的令牌,并认为这足以进行授权。为了避免我出于相同目的制作自己的令牌,他们可以对其进行签名,以便使用时需要原始令牌的精确副本。

这有两个目的:您不必管理复杂的映射方案,并且假设您的签名方法是安全的,猜测是不可能的。

请注意,有一种方法可以使用其他一些实现将加密信息存储在令牌中,但 C# 不支持该功能。