在JWT(JSON Web Token)中,HMACSHA256加密的结果经过了Base64编码处理,而Base64编码的输出会根据Base64 URL安全规范进行进一步处理。通常的Base64编码结果中可能包含+和/字符,这些字符在URL中可能会导致问题。因此,Base64 URL安全编码会将+替换为-,/替换为_,以确保生成的JWT可以安全地包含在URL中。
下面是一个简要的过程说明:
1. HMACSHA256加密:
- 原始数据使用HMACSHA256算法进行加密,得到一个二进制的哈希值。
2. Base64编码:
- 将二进制哈希值进行Base64编码。标准的Base64编码可能会产生+和/字符。
3. Base64 URL安全编码:
- 将Base64编码的字符串进行URL安全处理,即将+替换为-,/替换为_,并去掉尾部可能存在的=填充字符。
因此,最终JWT中的签名部分会包含-和_字符,这就是为什么你会在JWT中看到这些字符的原因。
示例
假设你有一个JWT,其签名部分是通过HMACSHA256算法生成的。这个签名在编码之前是byte[]
在进行Base64编码之后(未URL安全处理前),结果可能是:
DFdsMFu/VzPkUUS1eu/Kwyzvc6vSQ+x/HI3wEut72cU=
进行Base64 URL安全处理后,结果将是:
DFdsMFu_VzPkUUS1eu_Kwyzvc6vSQ-x_HI3wEut72cU
可以看到,+变成了-,而/变成了_,尾部的=被去掉了。
总结
JWT中的下划线_和横线-是由于Base64 URL安全编码规范而产生的,这是为了确保JWT在URL中使用时不会出错。