node.js - 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 是否有效。
解决方案
https://jwt.io调试器双向工作,您可以检查和验证令牌或创建和签署令牌。当您首先将令牌粘贴到左侧,然后将密钥或密钥粘贴到右侧列中“验证签名”下的字段中时,将重新创建签名,您应该注意到它已更改。在这种情况下,结果总是“签名验证”,因为签名只是根据输入的秘密计算的。
验证签名的正确方法是首先将密钥粘贴到密钥字段中,然后将令牌粘贴到调试器的左侧。始终确保输入字段中的任何其他内容都被覆盖。如果您的密钥实际上是 Base64 编码的(即以 Base64 编码形式存储的二进制秘密),您应该通过选中“秘密 base64 编码”复选框来告诉 jwt.io。
那么结果,无论是“签名”验证“还是“无效签名”,都是正确的。
之后您输入的每个秘密都会导致重新计算签名,然后它总是会被验证(使用新的秘密)。同样单击“秘密 bas64 编码”复选框会导致重新计算。
但是,如果您以正确的顺序执行此操作,则错误的秘密会导致“无效签名”结果:
推荐阅读
- php - 无法在 mysql 中更新表循环
- java - 如何获取从在 recyclerview 中单击的 firebase 数据库填充的项目的密钥
- ios - 将本地 json 文件解析为对象
- html - 如何阻止谷歌广告减慢我的网站速度?
- java - Docker 外部数据库映射
- ios - UICollectionViewLayout:在prepareLayout中尝试出列单元格会导致stackOverflow
- swift - Firebase 重复单元格
- c# - 与 Server.MapPath 等效的功能齐全的 ASP.Net Core
- python - 在 python 中绘制 4D 绘图
- c# - 实体框架,易于迭代的设置和多级层次结构的通用引用