標籤:java安全 java介面安全實現方案 java安全過濾器 介面安全實現
這輩子沒辦法做太多事情,所以每一件都要做到精彩絕倫!
People can‘t do too many things in my life,so everything will be wonderful
需要用到加解密工具類、自訂白名單
介面安全1 介面安全理論
介面的安全性主要圍繞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.1 實現流程
整個流程如下:
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 過濾器實現
過濾校正流程如下:
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
本文出自 “IT技術解決方案” 部落格,請務必保留此出處http://wyait.blog.51cto.com/12674066/1920134
java介面安全<乾貨篇>