根据参考文献1中JWT Token的组成及计算方式,对照参考文献2中的界面,实现简单的JWT Token解析及验证程序,主要功能包括:
1)拆分Token字符串,将前两段使用Base64UrlEncoder类解码并转为UTF8字符串(需添加Microsoft.IdentityModel.Tokens包);
2)调用HmacSha256算法计算Token前两段的Hash值,并转成字符串与Token进行对比验证,注意这里将Hash值转换成字符串时一定要用Base64UrlEncoder,不要用Convert.ToBase64String函数,这两者转换出的字符串还是有些许差异。反编译JwtSecurityTokenHandler().WriteToken函数,最终看到Token最后一段内容是调用Base64UrlEncoder编码的。
主要代码及程序运行效果如下所示:
string[] subString=txtToken.Text.Split('.');
txtHeader.Text=Encoding.UTF8.GetString(Base64UrlEncoder.DecodeBytes(subString[0]));
txtPayload.Text = Encoding.UTF8.GetString(Base64UrlEncoder.DecodeBytes(subString[1]));
txtSignature.Text=subString[2];
public static void ComputeHmacSha256(string message, string secret, string originHash)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(secret);
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
using (HMACSHA256 hmac = new HMACSHA256(keyBytes))
{
byte[] hash = hmac.ComputeHash(messageBytes);
if(string.Equals(originHash, Base64UrlEncoder.Encode(hash)))
{
MessageBox.Show("验证成功");
}
else
{
MessageBox.Show("验证失败");
}
}
}
参考文献:
[1]https://jwt.io/introduction/
[2]https://jwt.io/#debugger-io
[3]https://blog.csdn.net/x1234w4321/article/details/140316485