我在验证我获得的 JWT 令牌的签名时遇到一些问题。该令牌使用 HS256 进行签名。我尝试创建签名以证明收到的签名的代码是:
JwtSecurityToken token = tokenHandler.ReadJwtToken(tokenString);
byte[] keyBytes = Encoding.UTF8.GetBytes("secret");
HMACSHA256 hmac = new HMACSHA256(keyBytes);
byte[] signatureBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(token.RawHeader + "." + token.RawPayload));
string signature = Convert.ToBase64String(signatureBytes);
我从收到的令牌中获得的签名例如:
pYscLlinuNhO-sFyEIRRLZP7yrl8GopGJ3I6QSxg2tU
但我从算法中得到的签名是这样的:
pYscLlinuNhO+sFyEIRRLZP7yrl8GopGJ3I6QSxg2tU=
所以签名很接近,但不相等。我不明白我在验证签名时做错了什么。字母和数字似乎每次都是正确的,但特殊字符大多不同,并且签名末尾总是有一个“=”。
也许有人知道我做错了什么。
JWT 的三个部分是Base64Url 编码:
JWT 表示为一系列 URL 安全部分,由
句点('.')字符。每个部分都包含一个base64url编码的
价值。
但你用过Base64编码。 Base64Url 使用“-”和“_”代替“+”和“/”,并且还省略了末尾的填充“=”。
这是一个例子如何在C#中将base64转换为bas64url编码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)