首页 > 解决方案 > jwt.io 说签名验证即使没有提供密钥

问题描述

我用下面的片段在 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 是否有效。

标签: node.jsjwtsignjwt.io

解决方案


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

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

在此处输入图像描述

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

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

但是,如果您以正确的顺序执行此操作,则错误的秘密会导致“无效签名”结果:

在此处输入图像描述


推荐阅读