【问题标题】:verify signature of JWT Token c#验证 JWT Token c# 的签名
【发布时间】:2020-12-15 05:23:27
【问题描述】:

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

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

【问题讨论】:

    标签: c# jwt base64 signature verify


    【解决方案1】:

    JWT 的三个部分是Base64Url encoded

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

    但是你使用了Base64 编码。 Base64Url 使用 '-' 和 '_' 而不是 '+' 和 '/' 并且还省略了末尾的填充 '='。

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

    【讨论】:

    • 感谢您的快速答复。我用 Base64Url 试了一下,效果很好。
    猜你喜欢
    • 2017-04-03
    • 2016-07-10
    • 2016-08-28
    • 2019-11-14
    • 2018-09-16
    • 2014-05-29
    • 2017-12-30
    • 2019-11-01
    相关资源
    最近更新 更多