標籤:tde dict 程式 解密 目的 bubuko try 傳遞 輸入
1.JWT的概念:
JWT全稱是Json Web Token,是一種用於雙方之間傳遞安全資訊的簡潔的、URL安全的表述性聲明規範。JWT作為一個開放的標準( RFC 7519 ),定義了一種簡潔的,自包含的方法用於通訊雙方之間以Json對象的形式安全的傳遞資訊。因為數位簽章的存在,這些資訊是可信的,JWT可以使用HMAC演算法或者是RSA的公私秘鑰對進行簽名。
2.JWT的結構
JWT一般由三段構成,用.號分隔開,第一段是header,第二段是payload,第三段是signature,例如:
header(jwt的頭部)承載兩部分資訊就像JSON:
宣告類型。這裡是jwt
聲明加密的演算法。通常直接使用 HMAC SHA256,其它還有RS256等
playload 載荷就是存放有效資訊的地方。這個名字像是特指飛機上承載的貨品,這些有效資訊包含三個部分:
標準中註冊的聲明
公用的聲明
私人的聲明
標準中註冊的聲明 (建議但不強制使用) :
iss : jwt簽發者
sub:jwt所面向的使用者
aud:接收jwt的一方
exp:jwt的到期時間,這個到期時間必須要大於簽發時間
nbf:定義在什麼時間之前,該jwt都是停用.
iat :jwt的簽發時間
jti :jwt的唯一身份標識,主要用來作為一次性token,從而迴避重放攻擊。
公用的聲明 :
公用的聲明可以添加任何的資訊,一般添加使用者的相關資訊或其他業務需要的必要資訊.但不建議添加敏感資訊,因為該部分在用戶端可解密
私人的聲明 :
私人聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感資訊,因為base64是對稱解密的,意味著該部分資訊可以歸類為明文資訊
定義一個playload
signature jwt的第三部分是一個簽證資訊,這個簽證資訊由三部分組成:
header (base64後的)
payload (base64後的)
secret
這個部分需要base64加密後的header和base64加密後的payload使用.串連組成的字串,然後通過header中聲明的加密方式進行加secret組合加密,然後就構成了jwt的第三部分
如何應用
一般是在要求標頭裡加入Authorization,並加上Bearer標註:
在項目的封裝管理員控制台 ,輸入以下:
Install-Package JWT -Version 3.0.0
安裝JWT.NET 3.0.0
static void Main(string[] args) { IDateTimeProvider provider = new UtcDateTimeProvider(); var now = provider.GetNow(); var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); var secondsSinceEpoch = Math.Round((now - unixEpoch).TotalSeconds); var payload = new Dictionary<string, object>{ { "name", "MrBug" }, {"exp",secondsSinceEpoch+100 }, {"jti","luozhipeng" } }; Console.WriteLine(secondsSinceEpoch); IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); IJsonSerializer serializer = new JsonNetSerializer(); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder); string secret = "123";//密鑰 var token = encoder.Encode(payload, secret); Console.WriteLine(token); Decrypt(token,secret); Console.ReadKey(); } /// <summary> /// 解密 /// </summary> /// <param name="token">token資訊</param> /// <param name="secret">密鑰</param> private static void Decrypt(string token,string secret) { try { IJsonSerializer serializer = new JsonNetSerializer(); IDateTimeProvider provider = new UtcDateTimeProvider(); IJwtValidator validator = new JwtValidator(serializer, provider); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder); var json = decoder.Decode(token, secret, verify: true);//token為之前產生的字串 Console.WriteLine(json); } catch (TokenExpiredException) { Console.WriteLine("Token has expired"); } catch (SignatureVerificationException) { Console.WriteLine("Token has invalid signature"); } }
關於JWT.NET