jwt.io 说签名验证即使没有提供密钥

Posted

技术标签:

【中文标题】jwt.io 说签名验证即使没有提供密钥【英文标题】:jwt.io says Signature Verified even when key is not provided 【发布时间】:2021-12-20 00:45:43 【问题描述】:

我用下面的代码在 nodejs 中签署了一个 jwt。

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

我在签名后得到了下面的令牌

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InRlc3RAdGVzdC5jb20iLCJuYW1lIjoidGVzdCIsImlhdCI6MTYzNjE4MjYwOX0.07FXjm1lKEIiU_QOMEEOFzhsC0vtKt4PFoW-7YHHzyM

当我将 JWT 粘贴到 jwt.io 时,我想用 jwt.io 验证这一点,我可以看到该网站对我提供的任何密钥都显示“签名验证”(我不需要提供 abcd 这是我的实际钥匙)。我期望需要密钥来确定签名是否有效。 jwt.io如何判断一个jwt在没有原始key的情况下是否有效。

【问题讨论】:

它对我说“签名无效” static.rcgroups.net/forums/attachments/2/6/7/7/4/4/… @slebetman 基于问题标题即使未提供密钥也已验证签名您的陈述是正确的。当没有提供秘密时,结果是“无效签名”。但是,在问题中,OP 为我提供的任何密钥写入 “签名验证”。这就是我的回答所涵盖的情况。 【参考方案1】:

https://jwt.io 调试器双向工作,您可以检查和验证令牌或创建和签署令牌。当您首先将您的令牌粘贴到左侧并然后将密钥或密钥粘贴到右侧列中“验证签名”下的字段中时,将重新创建签名并你应该注意到它发生了变化。在这种情况下,结果总是“签名验证”,因为签名只是根据输入的秘密计算出来的。

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

那么“签名”验证或“签名无效”的结果都是正确的。

之后您输入的每个秘密都会导致重新计算签名,然后它总是会得到验证(使用新的秘密)。同样单击“秘密 bas64 编码”复选框会导致重新计算。

但是如果你按照正确的顺序做,一个错误的秘密会导致一个“无效的签名”结果:

【讨论】:

以上是关于jwt.io 说签名验证即使没有提供密钥的主要内容,如果未能解决你的问题,请参考以下文章

如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌

http://jwt.io 如何检索 keycloak 签名密钥?

为啥即使我没有在 Jwt.io 中提供秘密(签名),jwt 令牌也会显示有效负载?

签名验证失败。没有提供安全密钥来验证签名

JWT:验证签名秘密格式。

在 JWT.IO 中验证签名