1

我有以下 JSON Web 令牌:-

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI0NXo2bHdCVm9oVUVHU1p5RjdaREpIOFdZQTZ2blJWciIsImlhdCI6IjE1NjMyNjI0NTkuNjMiLCJhdWQiOiJwd2Etc2VhcmNoIiwiZXhwIjoxNTYzMjYzMzU5LCJzdWIiOiI4YmYxMzFmYi0zODJhLTRhODgtOWMxZS05NDk0Y2Q3ODdlYmYifQ.xlQ7tk_LADnw2whWVafyKCBc9cPKIRSSQo2kVxbynCA

现在,如果我对它进行 base64 解码,我会得到:-

{"alg":"HS256","typ":"JWT"}
{"iss":"45z6lwBVohUEGSZyF7ZDJH8WYA6vnRVr","iat":"1563262459.63","aud":"pwa-search","exp":1563263359,"sub":"8bf131fb-382a-4a88-9c1e-9494cd787ebf"}
�T;�O��9��VU��( \���!�B��W�

它的最后一部分,即签名没有被解码。它显示了一些奇怪的字符(�T;�O��9��VU��( \���!�B��W�)。我也想对其进行解码,以便知道它的确切值。

我怎样才能解码它?

4

1 回答 1

3

签名确实是 base64url 编码的,您可以对其进行解码。但结果是一个不打算打印的数值。您可以使用 base64url 库进行解码并查看程序中的值。结果是一个字节数组,它表示使用标头、有效负载和秘密作为输入计算的哈希值。

因为它是一个 C# 问题并且您询问如何对其进行解码,所以这里有一个代码片段,它可以手动进行转换,而无需任何额外的库:

string signatureBase64UrlEncoded = "xlQ7tk_LADnw2whWVafyKCBc9cPKIRSSQo2kVxbynCA";

string signatureBase64Encoded = signatureBase64UrlEncoded
            .Replace('_', '/').Replace('-', '+');
switch (signatureBase64Encoded.Length % 4)
{
    case 2: signatureBase64Encoded += "=="; break;
    case 3: signatureBase64Encoded += "="; break;
}

var decodedSignature = System.Convert.FromBase64String(signatureBase64Encoded);

将签名从 base64url 转换为 base64 编码的代码取自 Mark Gravell在此处的回答

decodedSignature一个字节数组:

在此处输入图像描述

也许这个答案对您来说很有趣,因为它解释了如何创建签名并将值转换为 base64url 编码。

于 2019-07-16T09:02:23.803 回答