【问题标题】:JWT Base64 Decode failed in Notepad++Notepad++ 中 JWT Base64 解码失败
【发布时间】:2018-04-16 11:31:09
【问题描述】:

Notepad++ 中,我在解码 JWT 时遇到问题。当我尝试使用Plugins -> MIME Tools -> Base64 Decode 时:

eyJleHAiOjE0NDIzNjAwMzQsIm5iZiI6MTQ0MjM1NjQzNCwidmVyIjoiMS4wIiwiaXNzIjoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tLzc3NTUyN2ZmLTlhMzctNDMwNy04YjNkLWNjMzExZjU4ZDkyNS92Mi4wLyIsImFjciI6ImIyY18xX3NpZ25faW5fc3RvY2siLCJzdWIiOiJOb3Qgc3VwcG9ydGVkIGN1cnJlbnRseS4gVXNlIG9pZCBjbGFpbS4iLCJhdWQiOiI5MGMwZmU2My1iY2YyLTQ0ZDUtOGZiNy1iOGJiYzBiMjlkYzYiLCJpYXQiOjE0NDIzNTY0MzQsImF1dGhfdGltZSI6MTQ0MjM1NjQzNCwiaWRwIjoiZmFjZWJvb2suY29tIn0 P>

我明白了:

要解码的所选文本(不包括 EOL)的长度无效。 应该是mod 4。

但是如果使用www.base64decode.org 就可以了:

{"exp":1442360034,"nbf":1442356434,"ver":"1.0","iss":"https://login.microsoftonline.com/775527ff-9a37-4307-8b3d-cc311f58d925/v2.0/","acr":"b2c_1_sign_in_stock","sub":"目前不支持. 使用 oid 声明。","aud":"90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6","iat":1442356434,"auth_time":1442356434,"idp":"facebook.com"}

这是为什么呢?我是否错误地使用了 Notepad++?


我使用的值来自Azure AD B2C: Token reference


2020/01/28 更新

我刚刚尝试了上面的 JWT,Plugins -> MIME Tools -> Base64 Decode 现在可以处理这个用例了????。我在插件的 v2.5 上。我猜v2.2 "fixed" this

npp mime 工具 v2.2 发布
donho 于 2018 年 11 月 28 日发布此内容
增强base64:无填充解码/编码

【问题讨论】:

  • 数据末尾的= 已被删除。只需添加一两个并重试。
  • @FlorentMorselli 就是这样!请提供答案,我会这样标记它
  • base64 -d Linux 上的命令可以成功解码 JWT 部分(从 eyJ 到下一个 .),而无需添加 =。如果最后缺少=,它只会显示错误消息base64: invalid input

标签: notepad++ jwt azure-ad-b2c


【解决方案1】:

简答:

要使字符串可解码,您必须使编码字符串中的字符数为 4 的整数倍。这意味着您必须将字符数除以 4 并且没有余数。在这种特殊情况下,您有 443 个字符。在末尾添加= 将使其可解码。

长答案:

Base64 编码使用称为填充的东西。输出中的字符数必须是 4 的整数倍。如果实际输出不满足该要求,编码算法将在输出中添加额外的填充字符。填充字符通常是 =

Wikipedia 上有一些例子说明了它是如何工作的。也可以看thisSO 贴。

“普通”base64url 编码和JWT 使用的base64url 编码之间存在差异:JWT 会跳过填充字符。它们根本没有添加。因此,JWT 的任何解码算法都必须考虑到这一事实。

普通的 base64 解码器不允许没有填充的编码字符串作为输入(如果需要填充)。大多数解码器在解码算法的开头都有一个断言,它们会检查输入字符串的长度并检查长度 % 4 = 0。您可以从错误消息中看到这一点

Length of selected text (not including EOL) to be decoded is invalid. It should be mod 4.

长度错误,因为缺少填充字符。

因此,使用处理无垫字符串的解码器是可行的方法。 Andre 已经链接了一个站点。 Here 是另一个。

【讨论】:

  • 我明白了,谢谢迈克!我在开头添加了一个=,我没有收到错误,但数据是垃圾。我还为克里斯的回答首先执行了URL Decode
  • @spottedmahn 我复制/粘贴了您的编码字符串并添加了一个= 使其为 444 个字符,可被 4 整除。解码后的内容对我来说看起来不错,但实际内容略有不同根据您在问题中的内容。我必须选择要解码的内容。
  • 我添加了=,但失败了。阅读您的回复后,我尝试附加它并且有效!
  • 您对编码令牌是正确的。我放错了。我已经更新了问题,谢谢!
  • @spottedmahn 好的,这很好。我在回答的基础上提供了一个较短的版本,以使其更适用于这种特殊情况。
【解决方案2】:

JWT 使用"base64url" 编码,该"base64url" 使用URL 安全字母表。

“base64url”编码是 Base 64 编码,其中 URL 保留字符被替换(例如,- 替换 +_ 替换 /)并且填充字符被删除。

【讨论】:

  • 而且,我可以补充一下,Notepadd++ 没有 base64url 解码器。
【解决方案3】:

上面的token和Azure B2C doc indicated里的不一样,好像是无效的。除非这个问题是关于 Notepad++ 的,否则我建议使用像 https://jwt.ms 这样的网站来解码令牌。 jwt.ms 不仅可以帮助您解码令牌,还可以帮助您了解每个声明的含义。

【讨论】:

猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 2020-01-24
  • 2019-08-15
  • 2016-12-14
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 2020-09-18
相关资源
最近更新 更多