如何寫出安全的API接口(參數加密+超時處理+私鑰驗證+Https)- 續(附demo)

轉載:http://www.cnblogs.com/codeon/p/6123863.html

?

上篇文章說到接口安全的設計思路,如果沒有看到上篇博客,建議看完再來看這個。

通過園友們的討論,以及我自己查了些資料,然后對接口安全做一個相對完善的總結,承諾給大家寫個demo,今天一并放出。

對于安全也是相對的,下面我來根據安全級別分析

?

1.完全開放的接口

有沒有這樣的接口,誰都可以調用,誰都可以訪問,不受時間空間限制,只要能連上互聯網就能調用,毫無安全可言。

實話說,這樣的接口我們天天都在接觸,你查快遞,你查天氣預報,你查飛機,火車班次等,這些都是有公共的接口。

我把這稱之為裸奔時代。代碼如下:

?View Code

?

2.接口參數加密(基礎加密)

?你寫個接口,你只想讓特定的調用方使用,你把這些調用的人叫到一個小屋子,給他們宣布說我這里有個接口只打算給你們用,我給你們每人一把鑰匙,你們用的時候拿著這把鑰匙即可。

這把鑰匙就是我上文說到的參數加密規則,有了這個規則就能調用。

這有安全問題啊,這里面的某個成員如果哪個不小心丟了鑰匙或者被人竊取,掌握鑰匙的人是不是也可以來掉用接口了呢?而且他可以復制很多鑰匙給不明不白的人用。

相當于有人拿到了你的請求鏈接,如果業務沒有對鏈接唯一性做判斷(實際上業務邏輯通常不會把每次請求的加密簽名記錄下來,所以不會做唯一性判斷),就會被重復調用,有一定安全漏洞,怎么破?先看這個場景的代碼,然后繼續往下看!

?View Code

?

3.接口參數加密+接口時效性驗證(一般達到這個級別已經非常安全了)

繼上一步,你發現有不明不白的人調用你的接口,你很不爽,隨即把真正需要調用接口的人又叫來,告訴他們每天給他們換一把鑰匙。和往常一樣,有個別伙伴的鑰匙被小偷偷走了,小偷煞費苦心,經過數天的踩點觀察,準備在一個月黑風高的夜晚動手。拿出鑰匙,搗鼓了半天也無法開啟你的神圣之門,因為小偷不知道你天天都在換新鑰匙。

小偷不服,經過一段時間琢磨,小偷發現了你們換鑰匙的規律。在一次獲得鑰匙之后,不加思索,當天就動手了,因為他知道他手里的鑰匙在第二天你更換鑰匙后就失效了。

結果,小偷如愿。怎么破?先看這個場景的代碼,然后繼續往下看!

?View Code

?

4.接口參數加密+時效性驗證+私鑰(達到這個級別安全性固若金湯)

?繼上一步,你發現道高一尺魔高一丈,仍然有偷盜事情發生。咋辦呢?你打算下血本,給每個人配一把鑰匙的基礎上,再給每個人發個暗號,即使鑰匙被小偷弄去了,小偷沒有暗號,任然無法如愿。即使小偷真正的如愿,這樣也很容易定位是誰的暗號泄漏問題,找到問題根源,只需要給當前這個人換下鑰匙就行了,不用大動干戈。

但這個并不是萬無一失的,因為鑰匙和暗號畢竟還有可能被小偷搞到。代碼如下:

復制代碼
/// <summary>/// 接口加密并根據時間戳判斷有效性而且帶著私有key校驗/// </summary>/// <returns></returns>[HttpGet][Route("SecureBySign/Expired/KeySecret")]public HttpResponseMessage SecureBySign_Expired_KeySecret([FromUri]int age, long _timestamp, string appKey, string _sign){//key集合,這里隨便弄兩個測試數據//如果調用方比較多,需要審核授權,根據一定的規則生成key把這些數據存放在數據庫中,如果功能擴展開來,可以針對不同的調用方做不同的功能權限管理//在調用接口時動態從庫里取,每個調用方在調用時帶上他的key,調用方一般把自己的key放到網站配置中Dictionary<string, string> keySecretDic = new Dictionary<string, string>();keySecretDic.Add("key_zhangsan", "D9U7YY5D7FF2748AED89E90HJ88881E6");//張三的key,keySecretDic.Add("key_lisi", "I9O6ZZ3D7FF2748AED89E90ZB7732M9");//李四的keyvar result = new ResultModel<object>(){ReturnCode = 0,Message = string.Empty,Result = string.Empty};#region 判斷請求是否過期---假設過期時間是20秒DateTime requestTime = GetDateTimeByTicks(_timestamp);if (requestTime.AddSeconds(20) < DateTime.Now){result.ReturnCode = -1;result.Message = "接口過期";return GetHttpResponseMessage(result);}#endregion#region 根據appkey獲取key值string secret = keySecretDic.Where(T => T.Key == appKey).FirstOrDefault().Value;#endregion#region 校驗簽名是否合法var param = new SortedDictionary<string, string>(new AsciiComparer());param.Add("age", age.ToString());param.Add("appKey", appKey);param.Add("appSecret", secret);//把secret加入進行加密param.Add("_timestamp", _timestamp.ToString());string currentSign = SignHelper.GetSign(param, appKey);if (_sign != currentSign){result.ReturnCode = -2;result.Message = "簽名不合法";return GetHttpResponseMessage(result);}#endregionvar dataResult = stulist.Where(T => T.Age == age).ToList();result.Result = dataResult;return GetHttpResponseMessage(result);}
復制代碼

?

5.接口參數加密+時效性驗證+私鑰+Https(我把這個級別稱之為金鐘罩,世間最安全莫過于此)

繼上一步,我們給傳輸機制改為Https,這下小偷徹底懵逼了。那么問題來了,Https咋玩兒呢?可以在本地搭個環境,參考此文:http://www.cnblogs.com/naniannayue/archive/2012/11/19/2776948.html

?

另:本文的接口是用的MVC WebAPI寫的,完全基于RESTful標準。如對此不是特別了解可以參考此文:http://www.cnblogs.com/landeanfen/p/5501490.html

?

完整demo下載

?

注:demo不能直接運行,需要把兩個web項目配置到iis中,api代表接口提供方,他的主域需要配置到business的webconfig中,在瀏覽器地址欄分別請求business中的各個調用接口方法來實現接口調用。

1、如果想驗證參數錯誤,需要在請求接口時打個斷點把接口url取出,篡改url參數,然后在瀏覽器中模擬請求

2、如果想驗證接口超時,需要在請求接口時打個斷點把接口url取出,然后等到了超時時間,然后在瀏覽器中模擬請求

3、如果想驗證私鑰錯誤,需要在請求接口時打個斷點把接口url取出,然后修改business的私鑰配置,然后在瀏覽器中模擬請求

轉載于:https://www.cnblogs.com/ruiati/p/7416627.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371420.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PrimeFaces在GlassFish 3.1.2.2上推動大氣

PrimeFaces 3.4在三天前問世。 除了通常令人敬畏的新組件和更新組件之外&#xff0c;它還包括新的PrimeFaces Push框架。 基于Atmosphere&#xff0c;這為您的應用程序提供了簡單的推送機制。 這是在最新的GlassFish 3.1.2.2上配置和運行它的方法。 準備工作 像往常一樣&#…

部分視圖跳轉

var album GetDailyDeal(); return PartialView("_DailyDeal", album); 通過NuGet需要添加microsoft.jquery.unobtrusive.ajax 方法一 在BundleConfig.cs 里添加 bundles.Add(new ScriptBundle("~/bundles/jqueryajax").Include("~/Scripts/jquery…

計算機二級目錄設置,word2設置標題格式,生成目錄,奇偶頁設置等等,適用考計算機二級辦公軟件,也適用于畢業論文格式設置...

word2設置標題格式,生成目錄,奇偶頁設置等等,適用考計算機二級辦公軟件,也適用于畢業論文格式設置 這是第2部分word資料 , 跟之前的第一部份word資料合為一份第二題2、在正文前按序插入節&#xff0c;使用“引用”中的目錄功能&#xff0c;生成如下內容&#xff1a;(1) 第1節&a…

JBoss AS 7類加載說明

這是示例章節&#xff0c;摘自Francesco Marchioni編輯的JBoss AS 7 Configuration Deployment and Administration一書&#xff0c;該書正在運行一個名為mastertheboss.com的JBoss門戶。 根據Java EE規范的要求&#xff0c;理想情況下&#xff0c;應用程序服務器應為其部署的應…

打印機 共享 問題

1 用戶提報無法打印&#xff0c;經查被共享打印機無法聯網&#xff0c;先檢查網線是否正常&#xff08;換其他電腦是否能行&#xff09;&#xff0c;再檢查交換機是否正常&#xff0c;經查交換機需要重啟&#xff0c;然后解決問題。 2 被共享機器為32位操作系統&#xff0c;其余…

CoordinatorLayout 中ToolBar遮擋RecyclerView的內容

解決方法:在RecyclerView中添加 app:layout_behavior"string/appbar_scrolling_view_behavior"參考資料:http://stackoverflow.com/questions/32855889/content-behind-coordinatorlayout-appbarlayout 轉載于:https://www.cnblogs.com/niluogege/p/6511094.html

兵團職稱計算機準考證查詢,兵團初級會計準考證打印入口官網

兵團初級會計準考證打印入口官網為財政部會計資格評價中心網(http://kzp.mof.gov.cn)。準考證打印時間在4月16日前公布&#xff0c;考生需要在規定時間登錄財政部會計資格評價中心網(http://kzp.mof.gov.cn)下載并打印準考證。未在上述時限內下載打印準考證的&#xff0c;視作放…

用于集成測試的Maven Cargo插件

在項目生命周期中&#xff0c;非常普遍的需求是設置集成測試。 幸運的是&#xff0c;Maven具有針對此確切方案的內置支持&#xff0c;具有默認構建生命周期的以下階段&#xff08;來自Maven 文檔 &#xff09;&#xff1a; 集成前測試 &#xff1a; 執行集成測試之前所需的操作…

jquery-文檔操作

1.text() 設置或返回元素的text值 <div id"divname">old text</div> $(#divname).text("new text"); 將改變顯示的old為new [1] 參考w3scholl文檔操作 轉載于:https://www.cnblogs.com/hellokittyblog/p/9128397.html

bzoj 4259: 殘缺的字符串

這題好神啊&#xff0c;居然是fft&#xff0c;表示一直在往數據結構上想。 把*當成0&#xff0c;那么兩個串可以匹配當且僅當$$\sum (a[i]-b[i])^2\times a[i]\times b[i]0$$ 我們可以把平方拆開&#xff0c;然后就變成了幾個乘積相加的形式&#xff0c;那就大力翻轉一個串然后…

錄屏時計算機休眠,硬盤錄像機里硬盤提示休眠,什么意思?

休眠&#xff0c;電腦內存中的數據寫入硬盤&#xff0c;關閉電腦。重新啟動的時候重新將數據加載到內存中&#xff0c;恢復休眠前狀態。睡眠&#xff0c;和休眠一個意思&#xff0c;98系統下叫睡眠。xp系統叫休眠。98系統睡眠時&#xff0c;內存數據寫入虛擬內存&#xff0c;xp…

MySQL數據庫的基本操作

-- 連接mysql 數據庫(前提是配置好MySQL數據庫的環境變量&#xff0c;加入path)mysql -uroot -p -- 設置文本的輸入輸出編碼&#xff1a;cmd 使用的是gbk&#xff0c;不然顯示亂碼set names gbk; -- 創建數據庫create database mydatabase charset utf8; -- 創建用戶 user001cr…

使用NoSQL實施實體服務–第5部分:使用云提高自治性

在先前的文章中&#xff0c;我討論了如何通過結合使用Java Web Services &#xff0c; Java EE和CouchDB NoSQL數據庫為產品構建SOA“實體”服務。 在本系列的最后一篇文章中&#xff0c;我將利用我已經創建的一些技術資產&#xff0c;并使用一些流行的SOA模式實現一些新的用戶…

樂高計算機發展史教程,【樂高產品發展史特別篇】樂高恐龍發展史

—— 寫在前面 ——2018年6月22日&#xff0c;《侏羅紀世界2&#xff1a;失落王國》全球上映&#xff1b;4月16日&#xff0c;樂高同名系列套裝全球發售。恐龍是一個伴隨了樂高產品二十余年的主題&#xff0c;其實在一年以前就有這樣一個計劃完成樂高恐龍發展史的相關內容&…

mvc 連接數據庫但單復值得問題

1. The model backing the ‘MusicStoreDBContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database Movie這個表是用來記錄Model的版本號的&#xff0c;你每次重新生成一次數據庫它就會重新給ModelHash…

Mybatis處理表關聯(懶加載)

1.關系型數據庫&#xff1f; 數據庫中的表對象之間是有關系的。 一對一&#xff0c;一對多&#xff0c;多對多。 ORM映射。數據庫表映射到實體對象。 實體與實體之間是有關系的。 一對多的關系。 比如商品分類表與商品表之間的關系&#xff0c;就是一對多的關系。 入庫主表與入…

Spring–設計領域模型和服務層

我們將為時間表管理構建應用程序。 因此&#xff0c;讓我們首先考慮一些用例和實體。 讓我用幾個項目符號寫它們&#xff1a; 任務由經理分配給員工。 一項任務可以分配給許多員工。 員工將他在某些任務上工作的小時數填滿至系統。 經理/員工查看時間表上的報告&#xff08;時…

如何把很多照片拼成一張照片_一張現場照片引發的中韓之爭

來源&#xff1a;渤海新水手聊船專欄前幾天&#xff0c;微信群里(造船質量技術高級交流群)一位網友發了一張韓國船廠的現場照片&#xff0c;沒想到瞬間引發全群幾十位網友的熱烈討論&#xff0c;中韓之爭就此上演&#xff01;照片反映出的是國內船廠很難做到的部分——分段預裝…

計算機文檔設置,電腦這樣設置快速的共享文件、分享文檔!

原標題&#xff1a;電腦這樣設置快速的共享文件、分享文檔&#xff01;在日常辦公的時候&#xff0c;有時需要共同使用一些文件或者文檔或者一些視頻資料。那么要怎么方便的使用這些共同的資源呢&#xff1f;當然這時大家可能會說可以用QQ、微信傳給對方不就可以了。但是如果文…

關于vue 框架與后臺框架的混合使用的嘗試

這幾天我在研究前臺框架和后臺框架融合的問題,進行了一些嘗試; 我前臺選擇的是 vue,當然也可以選擇 react 等其他 mvvm 框架,不過 vue 對于我來說是最熟悉的; 后臺話,我選擇的是 php 的 lumen 框架,他是laravel 的簡化版,因為比較輕量,所以這也是我的選擇; 先說下我這邊的環境:…