API接口安全性設(shè)計 接口的安全性主要圍繞Token、Timestamp和Sign三個機制展開設(shè)計,保證接口的數(shù)據(jù)不會被篡改和重復(fù)調(diào)用,下面具體來看:
Token授權(quán)機制:用戶使用用戶名密碼登錄后服務(wù)器給客戶端返回一個Token(通常是UUID),并將Token-UserId以鍵值對的形式存放在緩存服務(wù)器中。服務(wù)端接收到請求后進行Token驗證,如果Token不存在,說明請求無效。
關(guān)于token的說明:為不重復(fù)的字符串(一般為UUID),然后在Redis(任意緩存服務(wù)器)中維護Token—-Uid的用戶信息關(guān)系,以便其他api對token的校驗
時間戳超時機制:用戶每次請求都帶上當(dāng)前時間的時間戳timestamp,服務(wù)端接收到timestamp后跟當(dāng)前時間進行比對,如果時間差大于一定時間(比如5分鐘),則認為該請求失效,這個時間要保證足夠完成本次請求的同時盡量短,可以減少緩存服務(wù)器的壓力(見簽名機制)。
簽名機制:將Token和時間戳加上其他請求參數(shù)就行MD5或SHA-1算法(可根據(jù)情況加點鹽)加密,加密后的數(shù)據(jù)為本次請求的簽名sign,并將該簽名存放到緩存服務(wù)器中,超時時間設(shè)定為跟時間戳的超時時間一致(這就是為什么要盡量短,二者時間一致可以保證無論在timestamp規(guī)定時間內(nèi)還是外本URL都只能訪問一次)。服務(wù)端接收到請求后以同樣的算法得到簽名,并跟當(dāng)前的簽名進行比對,如果不一樣,說明參數(shù)被更改過,直接返回錯誤標(biāo)識。同一個簽名只能使用一次,如果發(fā)現(xiàn)緩存服務(wù)器中已經(jīng)存在了本次簽名,則拒絕服務(wù)。
整個流程如下:
1、客戶端通過用戶名密碼登錄服務(wù)器并獲取Token
2、客戶端生成時間戳timestamp,并將timestamp作為其中一個參數(shù)
3、客戶端將所有的參數(shù),包括Token和timestamp按照自己的算法進行排序加密得到簽名sign
4、將token、timestamp和sign作為請求時必須攜帶的參數(shù)加在每個請求的URL后邊(http://url/request?token=123×tamp=123&sign=123123123)
5、服務(wù)端寫一個過濾器對token、timestamp和sign進行驗證,只有三個參數(shù)都正確且在規(guī)定時間內(nèi),本次請求才有效 在以上三中機制的保護下,
如果黑客劫持了請求,并對請求中的參數(shù)進行了修改,簽名就無法通過;
如果黑客使用已經(jīng)劫持的URL進行DOS攻擊,服務(wù)器則會因為緩存服務(wù)器中已經(jīng)存在簽名而拒絕服務(wù),所以DOS攻擊也是不可能的;
如果黑客隔一段時間進行一次DOS攻擊(假如這個時間大于簽名在緩存服務(wù)器中的緩存時長),則會因為時間戳超時而無法完成請求,這就是為什么簽名的緩存時長要跟時間戳的超時時長一樣。