webapi token、參數簽名是如何生成的(轉載)
阿新 • • 發佈:2018-05-11
就是 blog webapi rod 空值 VC acc base cut
view plain copy
作者:張林
原文標題: webapi token、參數簽名是如何生成的
原文鏈接:http://blog.csdn.net/kebi007/article/details/72861532
API接口保障安全性原則:1.有調用者身份2.請求的唯一性3.請求的參數不能被篡改4.請求的有效時間
在剛接觸接口開發時,可能腦子裏壓根就沒有這個接口調用安全性的原則,但常識性的經驗告訴我們,每一個請求都應該有原則地保障安全性。例如這個接口 http://127.0.0.1/api/user/list?type=value 這個獲取用戶列表信息的請求總不能在地址欄一輸入就直接顯示信息(雖然有點誇張,不至於阿貓阿狗的信息這麽容易get吧),在寫webapi接口原則性的基本要求必須得保證數據的安全性和請求的有效性
在這裏我就使用Token+參數簽名+時間戳 這三個系統參數來辦證請求的有效性(即時100%請求有效,也不能說100%也安全了)。
參數名 | 必選 | 類型 | 作用 |
token | 是 | string | 調用方標識,保障其身份是來自本系統認證過的,有效識別用戶身份 |
sign | 是 | string | 接口參數的key,value的記錄,防止參數值被篡改,防止偽裝請求 |
timestamp | 是 | int | 時間戳,防止重放攻擊 |
那麽問題來
1.token 如何生成?作用是什麽?
2.參數簽名如何生成?作用是什麽?
3.時間戳的作用是什麽?
看了這篇文章你就知道了。這三個系統參數是如何保證請求的有效性,一定程度上提高數據的安全性
1.token如何生成的?作用是什麽?
token生成:一般的api基本上主要分為兩種客戶端訪問api的token和需要用戶登錄之後的token,這裏我就來說一下後者,(簡單通俗做法)用戶登錄輸入用戶名、密碼,訪問api,驗證數據庫成功。這個時候可以產生token,失敗直接返回。問題又來了! 1.token生成的方式是什麽?2.token存在哪裏?3.token如何驗證是否正確 在驗證數據成功之後可以獲取唯一用戶標識(用戶名也行),就以username:zhanglin為例吧,對這個標識進行加密(des,MD5、其他的也行,關鍵數據必須得加密),這個加密之後的字符串就可以做為一個Token了。 2.token每次請求都需要進行傳遞,推薦存在cookie,也可以持久化到客戶端。現在有這樣一個api接口http://127.0.0.1/api/user/list?token=encryptUsernameStr 這個encryptZhanglinStr就是登錄成功後加密的username返回的給客戶端,客戶端用什麽保存這裏就不多介紹了,只需要知道返回給客戶端一個用戶訪問的Token類即可,到了服務器端方法驗證的時候再進行解密,獲取到字符串zhanglin,然後將這個zhanglin與系統用戶(可采用緩存數據庫、緩存token的值)對比,如果對比存在,則說明有權限去訪問api,反之非法的請求。 還是代碼來實現一下吧。代碼比較容易理解,就是為了把這個原理說清楚一點 [csharp]- [Route("login")]
- public bool login(string account, string pwd)
- {
- var obj = Db.dbUsers.FirstOrDefault(f => f.Account == account && f.Pwd == pwd);
- if (obj != null)
- {
- string token = account.DESEncrypt(desKey);//加密產生token,
- HttpCookie cookie = new HttpCookie(cookieToken,token);
- HttpContext.Current.Response.Cookies.Add(cookie);//保存cookie
- return true;
- }
- else
- {
- return false;
- }
- }
- [Route("list"), HttpGet]
- public List<string> List(string type,string token)
- {
- var obj = Db.dbUsers.FirstOrDefault(p => p.Account == token.DESDecrypt(desKey));
- //驗證token
- if (obj != null)
- {
- //返回數據集
- }
- else
- {
- //非法請求
- }
- }
- public class MyFilterAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute
- {
- public override void OnActionExecuting(ActionExecutingContext context)
- {
- var request_param = context.ActionArguments.Values;
- var queryCollection = context.HttpContext.Request.Query;
- string account = string.Empty;
- string password = string.Empty;
- long timespan = 0;
- string signature = string.Empty;
- try
- {
- account = queryCollection.Where(p => p.Key == "account").Select(f => f.Value).FirstOrDefault().ToString();
- password = queryCollection.Where(p => p.Key == "password").Select(f => f.Value).FirstOrDefault().ToString();
- timespan = long.Parse(queryCollection.Where(p => p.Key == "timespan").Select(f => f.Value).FirstOrDefault().ToString());
- signature = queryCollection.Where(p => p.Key == "signature").Select(f => f.Value).FirstOrDefault().ToString();
- }
- catch (Exception ex)
- {
- var apiresult = ApiResult<bool>.Error("參數異常"+ex.ToString());
- context.Result = new JsonResult(apiresult);
- }
- //var accountName = context.RouteData.Values["accountName"].ToString()
- var expires_minute = (timespan - DateTime.Now.Ticks) / 60000000000;
- if (expires_minute> 10||expires_minute<-10)
- {
- var apimodel = ApiResult<bool>.Error("請求超時"+expires_minute);
- //var json = JsonConvert.SerializeObject(apimodel);
- JsonResult ret = new JsonResult(apimodel);
- context.Result =ret;
- }
- var ok = ("account" + account + "password" + password).Contains(signature);//ToDO 加密解密
- if (ok == false)
- {
- var apimodel = ApiResult<bool>.Error("非法請求");
- var json = JsonConvert.SerializeObject(apimodel);
- JsonResult ret = new JsonResult(apimodel);
- context.Result = ret;
- }
- base.OnActionExecuting(context);
- }
- }
作者:張林
原文標題: webapi token、參數簽名是如何生成的
原文鏈接:http://blog.csdn.net/kebi007/article/details/72861532
webapi token、參數簽名是如何生成的(轉載)