有没有办法在没有密钥的情况下解码JSON Web令牌(JWT)?

5

我对这个领域很新,但我试图使用JWT Nuget package生成JWT。

我的理解是你提供一个秘钥来签署Token,但是当我得到Token后,我去JWT网站测试它时,这个网站能够解码Token而无需我提供秘钥。

我认为你应该先生成Token,然后再签署它以防止任何人知道Token的内容,除非他们有那个秘钥。但情况并非如此吗?


1
签名并不等同于加密。 - Claies
我认为您混淆了“编码”和“加密”这两个术语。请查看此网站以获取良好的解释。 - Icemanind
感谢@Icemanind提供的链接。 - Sul Aga
1个回答

7
JSON Web Tokens是数据结构的编码表示形式。并不要求对这些编码数据进行加密,但这样做是可以接受的。
从代码签名的定义中可知:
代码签名是数字签名可执行文件和脚本的过程,以确认软件作者并保证代码自签名以来未被更改或损坏,使用加密哈希。”
已加密的JWT通常会有两个哈希值,第一个用于解密数据,第二个用于验证代码签名。解码未加密的JWT是标准化的过程,即使代码签名没有经过验证也可以完成。然而,建议如果代码签名哈希值不匹配,则不要使用JWT中的任何数据,因为这表明数据可能已被篡改。
并非所有的JWT实现都支持加密;值得注意的是,Microsoft的JWT实现中没有加密支持。https://dev59.com/vGMl5IYBdhLWcg3wqIdh#18224381。因此,如果您有必须确保保密的数据,您应该使用JWE来加密数据。JWT标准文档展示了这个过程的一个例子。数据首先被加密,然后加密字符串和解码算法作为JWT的有效载荷发送。

谢谢您的回答。如果您能提供更多资源来完成JWT生成和加密,我将不胜感激。尽管如此,我仍会将其标记为答案。 - Sul Aga
我更新了我的答案,加入了更多的上下文信息,希望能为您指明正确的方向。 - Claies
谢谢。假设我使用上述包生成了一个JWT,然后使用.NET中可用的加密机制对生成的令牌进行了加密,这种方法有问题吗? - Sul Aga
如果你加密JWT而不是加密数据,那么你传递的是一个加密字符串,你需要负责解密;在这种情况下,JWT实际上没有任何作用,除了作为数据抽象的一层。使用JWT的目的是发送数据的字符串表示形式;由于加密字符串已经具备这个功能,你失去了JWT所提供的任何好处。 - Claies
很抱歉一直问同一个话题,希望不会打扰到您。生成JWT并仅加密数据是非常明智的做法。如果您能告诉我哪些部分的JWT是您的数据,我将不胜感激?除了标准值之外还有其他内容吗? - Sul Aga
例如,使用ASP.Net Identity 2.0包,您可以在JWT中包含access_tokenaccess_token是在身份验证过程中加密的数据,并且可以附加声明(例如角色)。 应用程序使用的其他数据可能不是敏感的,也可能不需要包含在access_token中(令牌类型、过期时间等)。 - Claies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接