這輩子沒辦法做太多事情,所以每一件都要做到精彩絕倫!
people can't do too many things in my life,so everything will be wonderful
需要用到
加解密工具類、自定義白名單
介面的安全性主要圍繞token、timestamp(ts)和sign三個機制展開設計,保證介面的資料不會被篡改和重複呼叫,下面具體來看:
token授權機制:使用者使用使用者名稱密碼登入後伺服器給客戶端返回乙個token(通常是uuid或是經過一定規則加密的字串),並將token:userid以鍵值對的形式存放在快取伺服器(redis)中。服務端接收到請求後進行token驗證,如果token不存在,說明請求無效。
時間戳ts超時機制:使用者每次請求都帶上當前時間的時間戳timestamp(ts),服務端接收到timestamp後跟當前時間進行比對,如果時間差大於一定時間(比如5分鐘),則認為該請求失效,這個時間要保證足夠完成本次請求的同時盡量短,可以減少快取伺服器的壓力(見簽名機制)。
簽名機制:將token和時間戳加上其他請求引數(也可加上使用者個人私鑰:鹽)進行md5或sha-1演算法(可根據情況加點鹽)加密,加密後的資料為本次請求的簽名sign。服務端接收到請求後以同樣的演算法得到簽名,並跟當前的簽名進行比對,如果不一樣,說明引數被更改過,直接返回錯誤標識。一樣的話,服務端
將該簽名存放到快取伺服器(redis)中,超時時間設定為跟時間戳的超時時間一致(這就是為什麼要盡量短,二者時間一致可以保證無論在timestamp規定時間內還是外本url都只能訪問一次)同乙個簽名只能使用一次,如果再次請求發現快取伺服器中已經存在了本次簽名,則拒絕服務。
整個流程如下:
1、客戶端通過使用者名稱密碼登入伺服器並獲取token(或token:salt)
2、客戶端生成時間戳timestamp(ts),並將timestamp進行aes加密,作為其中乙個引數
3、客戶端將所有的引數,包括token和timestamp(ts)按照自己的演算法進行排序+salt鹽,進行加密得到簽名sign
4、將token、timestamp(ts)和sign作為請求時必須攜帶的引數加在每個請求的url後邊(http://url/request?a=aa&b=bb&token=123×tamp=123&sign=123123123)
5、服務端寫乙個過濾器對token、timestamp和sign進行驗證,只有三個引數都正確且在規定時間內,本次請求才有效(具體實現參考:1.2過濾器實現)
在以上三中機制的保護下,
如果黑客劫持了請求,並對請求中的引數進行了修改,簽名就無法通過;
如果黑客使用已經劫持的url進行dos攻擊,伺服器則會因為快取伺服器中已經存在簽名而拒絕服務,所以dos攻擊也是不可能的;
如果黑客隔一段時間進行一次dos攻擊(假如這個時間大於簽名在快取伺服器中的快取時長),則會因為時間戳超時而無法完成請求,這就是為什麼簽名的快取時長要跟時間戳的超時時長一樣。
如果簽名演算法和使用者名稱密碼都暴露了,那就只能:666 了
過濾校驗流程如下:
1,判斷是否是白名單;
2,判斷是否是test;(用於開發中測試介面使用;上線時去掉該段**)
3,獲取請求引數requestmap,判斷是否有引數;
4,遍歷requestmap,校驗,並將引數存放在parammap(按字母順序排序)中;其中的鹽和sign值單獨存放,用於後續的加密和比對;
5,獲取sign,並判斷redis中是否已經存在,存在的話,返回error;
6,獲取ts,判斷是否可解密和是否超時;否返回:error;
7,獲取token,判斷token是否可解密和是否於redis中的匹配,否返回:error(也可進行是否登入校驗);
8,檢查是否有簽名值和salt鹽;
9,對parammap拼接成字串paramstring;
10,對paramstring+私鑰(salt)進行sign加密;和請求引數sign進行比對;不一樣,返回:error
JAVA基礎篇介面與多型的概述
首先說一下什麼是介面 介面定義的是一種規範,打個比方 只有滿足我這個介面的電器才能往上插,只要是中國大陸生產的家有電器,必須遵守這個插孔規範 介面是一種規範,介面是給類定義的規範,類和介面發生關係後,類要重寫介面中的所有抽象方法 介面是一種引用型別,介面的定義格式 public inte ce 介面...
java 如何保證介面的安全性
根據使用者名稱或者使用者id,結合使用者的ip或者裝置號,生成乙個token。在請求後台,後台獲取http的head中的token,校驗是否合法 和資料庫或者redis中記錄的是否一致,在登入或者初始化的時候,存入資料庫 redis 在使用base64方式的編碼後,token字串還是有20多位,有的...
Java基礎篇 03多型 抽象類 介面
事務的多種形態 前提 1 有繼承關係,2 有方法重寫,3 要有父類引用指向子類物件,比如 animal a new cat a.eat 成員變數 編譯看左邊 父類 執行看左邊 父類 成員方法 編譯看左邊 父類 執行看右邊 子類 向上轉型與向下轉型 父類引用指向子類物件就是向上轉型。對態好處 1 提高...