jwt.io显示签名验证通过,即使没有提供密钥

11

我在nodejs中使用以下代码片段签署了一个jwt。

var jwtoken = jwt.sign({ email: 'test@test.com', name: 'test' }, 'abcd');

我签名后得到了以下令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InRlc3RAdGVzdC5jb20iLCJuYW1lIjoidGVzdCIsImlhdCI6MTYzNjE4MjYwOX0.07FXjm1lKEIiU_QOMEEOFzhsC0vtKt4PFoW-7YHHzyM

我想通过jwt.io验证JWT的有效性,当我将JWT粘贴到jwt.io中时,无论我提供什么密钥(实际密钥为abcd),该网站都会显示“签名已验证”。 我本来以为需要提供密钥才能确定签名是否有效,那么jwt.io是如何在没有原始密钥的情况下确定JWT是否有效的呢?

它对我说“无效签名”。 - slebetman
https://static.rcgroups.net/forums/attachments/2/6/7/7/4/4/a15524259-81-Screenshot%20at%202021-11-06%2015-34-34.png - slebetman
@slebetman,根据问题标题“即使未提供密钥也验证签名”,您的陈述是正确的。当没有提供密钥时,结果为“无效签名”。然而,在问题中,OP写道:“无论我提供什么密钥都会验证签名”。这就是我回答中涉及到的情况。 - jps
2个回答

30
JWT.IO 调试器能够双向操作,您可以检查并验证令牌或创建并签署令牌。当您首先将令牌粘贴到左侧,然后将密钥粘贴到右列的“验证签名”字段下时,将重新创建签名,您应该会注意到它已更改。在这种情况下,结果始终为“签名已验证”,因为签名是基于输入的密钥计算出来的。

验证签名的正确方式是首先将密钥粘贴到密钥字段中,然后将令牌粘贴到调试器的左边部分。请确保覆盖输入字段中的任何其他内容。如果您的密钥实际上是Base64编码的(即以Base64编码形式存储的二进制密钥),您应该通过选中“密钥Base64编码”复选框告诉jwt.io。

图片描述

然后,结果要么是“签名已验证”,要么是“无效签名”,将是正确的。

之后您输入的每个密钥都会导致签名的重新计算,然后总是被验证(使用新密钥)。另外,单击“密钥Base64编码”复选框会导致重新计算。在此输入图像描述

但如果按正确顺序操作,一个错误的密钥会导致“签名无效”的结果:

在此输入图像描述


令人惊讶的答案,一点也不琐碎。 - Shai Katz

0

jps的答案对于对称密钥(服务器和客户端都有私钥)是正确的,但如果您使用非对称加密(例如RSA,这是SSL/TLS证书用于HTTPS的加密方式),并使用公钥验证签名,则jwt.io使用OIDC提供程序元数据来定位公钥。在此处查看完整描述: JWT.io如何已知我的公钥?


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