JWT加密解密


如何保證WebAPI的安全?
1、JWT加密解密。token
2、使用https傳輸協議。
3、把用戶所有請求的參數信息加上一個只有服務器端知道的secret,做個散列運算,然后到了服務器端,服務器端也做一個散列運算。如果散列值是一樣的,那就表示沒被篡改。
4、在業務邏輯上進行保護。(檢查訪問者是否有權限來實現一些操作。這點是最主要的,前面3的未必能夠100%保證安全)


JWT由三部分組成(Header,Payload,Signature),可以把用戶名、角色等無關緊要的信息保存到Payload部分。

Header:base64enc({ "alg":"HS256","TYPE":"JWT"})  // eyAiYWxnIjoiSFMyNTYiLCJUWVBFIjoiSldUIn0=

Payload:base64enc({"user":"vichin","pwd":"weichen123"})  //用戶的關鍵信息 eyJ1c2VyIjoidmljaGluIiwicHdkIjoid2VpY2hlbjEyMyJ9

Signature:HMACSHA256(base64enc(header)+","+base64enc(payload),secretKey)

Header和Payload部分使用的是Base64編碼,幾乎等於明文,Signature部分是根據header+payload+secretKey進行加密算出來的,如果Payload被篡改,就可以根據Signature解密時候校驗。

 

首先需要添加引用

install-package JWT (3.0.1支持 .net framework 3.5,3.0.2需要.net 4.6.2)。

        public void AddSecret()
        {
            double exp = (DateTime.UtcNow.AddSeconds(10) - new DateTime(1970, 1, 1)).TotalSeconds;//10秒過期
            var payload = new Dictionary<string, object>
            {
                {"UserID",123},
                {"UserName","admin"},
                { "exp",exp}//過期時間的key必須叫exp
            };
            string secret = "123456789";//不能泄露的key
            IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
            IJsonSerializer serialer = new JsonNetSerializer();
            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            IJwtEncoder encoder = new JwtEncoder(algorithm, serialer, urlEncoder);
            string token = encoder.Encode(payload, secret);
            textBox1.Text = token;
        }

 

        public void SubSecret(string token)
        {
            //string token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySUQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.OR0lZOfbQr7D2wnY_m44tX9DOoNmDWV-6X53_ZZGJAs";
            var secret = "123456789"; //不能泄露的key
            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);                
            }
            catch (TokenExpiredException)
            {
                MessageBox.Show("Token has expired");
            }
            catch (SignatureVerificationException)
            {
                MessageBox.Show("簽名驗證失敗,數據可能被篡改");
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM