接口的安全性主要圍繞Token、Timestamp和Sign三個機制展開設計,保證接口的數據不會被篡改和重複調用,下面具體來看:算法
Token受權機制:用戶使用用戶名密碼登陸後服務器給客戶端返回一個Token(一般是UUID),並將Token-UserId以鍵值對的形式存放在緩存服務器中。服務端接收到請求後進行Token驗證,若是Token不存在,說明請求無效。緩存
時間戳超時機制:用戶每次請求都帶上當前時間的時間戳timestamp,服務端接收到timestamp後跟當前時間進行比對,若是時間差大於必定時間(好比5分鐘),則認爲該請求失效,這個時間要保證足夠完成本次請求的同時儘可能短,能夠減小緩存服務器的壓力(見簽名機制)。安全
簽名機制:將Token和時間戳加上其餘請求參數就行MD5或SHA-1算法(可根據狀況加點鹽)加密,加密後的數據爲本次請求的簽名sign,並將該簽名存放到緩存服務器中,超時時間設定爲跟時間戳的超時時間一致(這就是爲何要儘可能短,兩者時間一致能夠保證不管在timestamp規定時間內仍是外本URL都只能訪問一次)。服務端接收到請求後以一樣的算法獲得簽名,並跟當前的簽名進行比對,若是不同,說明參數被更改過,直接返回錯誤標識。同一個簽名只能使用一次,若是發現緩存服務器中已經存在了本次簽名,則拒絕服務。服務器
整個流程以下:加密
一、客戶端經過用戶名密碼登陸服務器並獲取Tokenurl
二、客戶端生成時間戳timestamp,並將timestamp做爲其中一個參數設計
三、客戶端將全部的參數,包括Token和timestamp按照本身的算法進行排序加密獲得簽名sign排序
四、將token、timestamp和sign做爲請求時必須攜帶的參數加在每一個請求的URL後邊(http://url/request?token=123×tamp=123&sign=123123123)token
五、服務端寫一個過濾器對token、timestamp和sign進行驗證,只有三個參數都正確且在規定時間內,本次請求才有效接口
在以上三中機制的保護下,
若是黑客劫持了請求,並對請求中的參數進行了修改,簽名就沒法經過;
若是黑客使用已經劫持的URL進行DOS攻擊,服務器則會由於緩存服務器中已經存在簽名而拒絕服務,因此DOS攻擊也是不可能的;
若是黑客隔一段時間進行一次DOS攻擊(假如這個時間大於簽名在緩存服務器中的緩存時長),則會由於時間戳超時而沒法完成請求,這就是爲何簽名的緩存時長要跟時間戳的超時時長同樣。