JWT 有啥保障?

Posted

技术标签:

【中文标题】JWT 有啥保障?【英文标题】:What is secured about JWT?JWT 有什么保障? 【发布时间】:2014-02-28 16:58:55 【问题描述】:

我正在使用 JWT 来生成和使用令牌。经过数周的阅读规范和谷歌搜索,我仍然不明白:如果我可以在一台机器上生成令牌然后在另一台机器上打开它,那么令牌有什么安全保障?书面令牌是否应该以某种方式加密?我正在使用System.IdentityModel.Tokens 并使用JwtSecurityTokenJwtSecurityTokenHandler 创建令牌。

有人可以请我指向一个主要解释其安全方面的主题文档吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

您的起始陈述“JwtSecurityToken 并非旨在加密其内容”是错误的。 JWT 支持签名 (JWS) 和加密令牌 (JWE)。请更新您的答案。 @ZólyomiIstván:我找不到任何说 JwtSecurityToken 可以对其内容进行加密的内容。如果您想指出此类信息,我将更新我的答案。 啊,你是对的。我一般都在谈论 JWT,但忘记了 c# 标签。我愿意删除我的反对票,但现在我的投票已被系统锁定,直到编辑答案为止。 @ZólyomiIstván:我继续将答案限制在 C# 实现中以避免混淆。 @FutuToad:我无法发送数据“guvante”、“guvante 的真棒应用程序”,因为签名将不再有效。我只能发送“eddyuk”,“eddyuk 的绝妙应用”。【参考方案2】:

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

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

【讨论】:

@SteveTaylor 我想我终于明白了 这个答案非常有帮助,并提供了所有技术实施的完整图片。谢谢:)

以上是关于JWT 有啥保障?的主要内容,如果未能解决你的问题,请参考以下文章

ROSEHA和ROSEMIRRORHA有啥区别

灵活多样认证授权,零开发投入保障 IoT 安全

天龙八部私服和官服有啥区别?

Spark的HiveThriftServer2服务可用性保障(上)

DRF-JWT

有社会保障卡是否代表有社保