JWT算法

jwt的header

JWT头是一个描述JWT元数据的JSON对象,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存

{
    "alg": "HS256",
    "typ": "JWT"
}

jwt的data/Payload

存储的有效数据,可以自定义任何数据,有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT指定七个默认字段供选择

{
    "sub": "123",
    "exp": 1646064000
}

jwt的.net算法

/// 
/// 生成jwt
/// 
/// 
/// 
/// 
private static string GetJwt1()
{
   //算法说明 jwt.io
   //payload=header_64 + "." + data_64
   //sig = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), "key")

   var exp = (DateTime.Now.AddDays(30).ToUniversalTime().Ticks - 621355968000000000) / 10000000;

   var header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
   var data = $"{{\"sub\":\"123456\",\"exp\":{exp}}}";
   var key = "abc123-ssss123";

   var header_64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(header)).Replace('+', '-').Replace('/', '_').Replace("=", "");
   var data_64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(data)).Replace('+', '-').Replace('/', '_').Replace("=", "");
   var payload = header_64 + "." + data_64;

   byte[] key_byte = Encoding.UTF8.GetBytes(key);
   byte[] message = Encoding.UTF8.GetBytes(payload);

   string sig = Convert.ToBase64String(new HMACSHA256(key_byte).ComputeHash(message)).Replace('+', '-').Replace('/', '_').Replace("=", "");

   var jwtStr = $"{header_64}.{data_64}.{sig}";
   return jwtStr;
}

你可能感兴趣的:(JWT算法)