验证JWT令牌c#的签名

时间:2020-08-26 11:56:49

标签: c# jwt base64 signature verify

我在验证获得的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=

因此,签名是接近的,但不相等。验证签名时,我没有发现我做错了什么。字母和数字似乎每次都是正确的,但是特殊字符大都不同,并且签名的末尾总是有一个“ =”。 也许有人知道我在做什么错。

1 个答案:

答案 0 :(得分:1)

JWT的三个部分是Base64Url encoded

JWT表示为URL安全部分的序列,由 句点('。')字符。每个部分都包含一个以base64url编码的 值。

但是您使用了Base64编码。 Base64Url使用'-'和'_'代替'+'和'/',并且最后省略了填充'='。

Here is an example如何在C#中将base64转换为bas64url编码