JWT Base64解码在Notepad ++中失败

spo*_*ahn 4 notepad++ jwt azure-ad-b2c

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

eyJleHAiOjE0NDIzNjAwMzQsIm5iZiI6MTQ0MjM1NjQzNCwidmVyIjoiMS4wIiwiaXNzIjoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tLzc3NTUyN2ZmLTlhMzctNDMwNy04YjNkLWNjMzExZjU4ZDkyNS92Mi4wLyIsImFjciI6ImIyY18xX3NpZ25faW5fc3RvY2siLCJzdWIiOiJOb3Qgc3VwcG9ydGVkIGN1cnJlbnRseS4gVXNlIG9pZCBjbGFpbS4iLCJhdWQiOiI5MGMwZmU2My1iY2YyLTQ0ZDUtOGZiNy1iOGJiYzBiMjlkYzYiLCJpYXQiOjE0NDIzNTY0MzQsImF1dGhfdGltZSI6MTQ0MjM1NjQzNCwiaWRwIjoiZmFjZWJvb2suY29tIn0

我得到:

要解码的所选文本(不包括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:令牌参考

Chr*_*ett 7

JWT 使用“base64url”编码,它使用 URL 安全字母表。

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


Mik*_*kaS 6

简短答案:

要使字符串可解码,您必须使编码字符串中的字符数为4的整数倍。这意味着您必须将字符数除以4,而不能得到余数。在这种情况下,您有443个字符。=在末尾添加a 将使其可解码。

长答案:

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

维基百科上有一些有关其工作原理的示例。您还可以看到 SO帖子。

“普通” 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.
Run Code Online (Sandbox Code Playgroud)

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

因此,使用处理无填充字符串的解码器是必经之路。安德烈已经链接了一个站点。是另一个。