如何生成与 JWT.IO 网站相同的签名?

Posted

技术标签:

【中文标题】如何生成与 JWT.IO 网站相同的签名?【英文标题】:How to generate the same signature as the JWT.IO website does? 【发布时间】:2016-11-06 13:55:17 【问题描述】:

JWT.IO 网站有一个调试器,用于创建和验证 JSON Web 令牌。

当我将我的秘密字符串复制并粘贴到 VERIFY SIGNATURE 块中时,我可以看到它生成了一个签名。

我向下滚动页面,找到the .NET solution implemented by Microsoft。下载后,我添加我的单元测试以手动生成签名。

但是,JWT.IO 网站生成的签名与我的单元测试生成的签名略有不同。

Secrect string: "THIS IS A SECRET STRING WHICH CAN BE SHARED BETWEEN THE SERVICES"
Unit test signature: "B0d57pcHoDiTDE/98dyrMx9HoFKGLOcM094eYBgJqHo="
JWT.IO    signature:  B0d57pcHoDiTDE_98dyrMx9HoFKGLOcM094eYBgJqHo

我注意到 JWT.IO 签名字符串是 URL 编码安全的,但单元测试签名不是。

更新

下面接受的答案将我指向the class Base64UrlEncoder。我已经修改了我的单元测试以生成与 JWT.IO 网站完全相同的签名:

【问题讨论】:

【参考方案1】:

@Believe2014 jwt.io 网站似乎没有一些选项来指定 base64 编码,使用哪种 URLEncoding 方式生成与您的单元测试相同的签名。

但是,根据RFC 4648 的第 4 和 5 部分,两种签名之间的区别在于使用不同的字符来表示字节 6263 以及是否省略了填充字符 =

因此,要将jwt.io生成的签名转换为您的签名,只需使用/而不是_,使用+而不是-,并在签名末尾添加填充字符= .

【讨论】:

感谢您的回答。我可以在 Mircosoft 的源代码中找到类 Base64UrlEncoder,它执行与您描述的类似的替换步骤。 github.com/AzureAD/…

以上是关于如何生成与 JWT.IO 网站相同的签名?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jsonwebtoken 库生成的 JWT 令牌在 jwt.io 中提供了无效签名

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

Python JWT 库 PyJWT 使用 HS256 签名时遇到问题 - 使用 SHA-256 哈希算法的 HMAC

生成 JWT 表单头和有效负载

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

使用 RS256 生成的 JWT 可以被 jwt.io 网站解码吗?