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