我正在使用 JWT 来生成和使用令牌。经过数周的阅读规范和谷歌搜索,我仍然不明白:如果我可以在一台机器上生成令牌然后在另一台机器上打开它,那么令牌有什么安全保障?书面令牌是否应该以某种方式加密?我正在使用andSystem.IdentityModel.Tokens
创建令牌。JwtSecurityToken
JwtSecurityTokenHandler
有人可以向我指出一个关于主题的重点文档,主要解释它的安全方面吗?
JWT 的前两个部分未加密,因此任何在服务器上生成 JWT 并将其发送回客户端的应用程序都应该通过 SSL 进行加密。这通常作为对登录请求的响应发送给用户,无论如何都应该通过 SSL 发送,因为它通常包含用户名和密码组合。发送到服务器的后续请求也应该通过 SSL 完成,因为无论您使用哪种令牌 - 无论是 JWT 还是其他 - 它都不应该以未加密的形式对数据包嗅探可见,否则用户会话可能被劫持。
JWT 的安全方面来自第三个也是最后一个部分。它是通过使用只有服务器知道的密钥对前两个段进行签名而生成的。当服务器生成的 JWT 作为经过身份验证的请求的一部分被发送回该服务器时,服务器知道密钥,因此可以验证第三段中的签名并使用该签名来确保前两个段没有被修改由服务器签名。
据我所知,C# 的实现JwtSecurityToken
并非旨在加密其内容(正如您的问题所暗示的那样)。相反,它旨在对其内容进行签名。这与令牌的典型安全模型一致。它应该是一条以其他方式受到保护的信息。
区别在于您没有试图隐藏任何信息,您只是在验证信息的来源(以及完整性,但这是相关的)。
例如,Twitter 可以给你一个包含数据“eddyuk”、“eddyuk 的真棒应用程序”的令牌,并认为这足以进行授权。为了避免我出于相同目的制作自己的令牌,他们可以对其进行签名,以便使用原始令牌的精确副本。
这有两个目的:您不必管理复杂的映射方案,并且假设您的签名方法是安全的,猜测是不可能的。
请注意,有一种方法可以使用其他一些实现将加密信息存储在令牌中,但 C# 不支持该功能。