面試官:如何保證 token 的安全

接口的安全性主要圍繞 token、timestamp 和 sign 三個機制展開設計,保證接口的數據不會被篡改和重複調用,下面具體來看:

Token 授權機制:

用戶使用用戶名密碼登錄後服務器給客戶端返回一個 Token(通常是 UUID),並將 Token-UserId 以鍵值對的形式存放在緩存服務器中。服務端接收到請求後進行 Token 驗證,如果 Token 不存在,說明請求無效。Token 是客戶端訪問服務端的憑證。

時間戳超時機制:

用戶每次請求都帶上當前時間的時間戳 timestamp,服務端接收到 timestamp 後跟當前時間進行比對,如果時間差大於一定時間(比如 5 分鐘),則認爲該請求失效。時間戳超時機制是防禦 DOS 攻擊的有效手段。

簽名機制:

將 Token 和 時間戳 加上其他請求參數再用 MD5 或 SHA-1 算法(可根據情況加點鹽)加密,加密後的數據就是本次請求的簽名 sign,服務端接收到請求後以同樣的算法得到簽名,並跟當前的簽名進行比對,如果不一樣,說明參數被更改過,直接返回錯誤標識。簽名機制保證了數據不會被篡改。

拒絕重複調用(非必須):

客戶端第一次訪問時,將簽名 sign 存放到緩存服務器中,超時時間設定爲跟時間戳的超時時間一致,二者時間一致可以保證無論在 timestamp 限定時間內還是外 URL 都只能訪問一次。如果有人使用同一個 URL 再次訪問,如果發現緩存服務器中已經存在了本次簽名,則拒絕服務。如果在緩存中的簽名失效的情況下,有人使用同一個 URL 再次訪問,則會被時間戳超時機制攔截。這就是爲什麼要求時間戳的超時時間要設定爲跟時間戳的超時時間一致。拒絕重複調用機制確保 URL 被別人截獲了也無法使用(如抓取數據)。

流程如下:

在以上三中機制的保護下,

如果有人劫持了請求,並對請求中的參數進行了修改,簽名就無法通過;

如果有人使用已經劫持的 URL 進行 DOS 攻擊,服務器則會因爲緩存服務器中已經存在簽名或時間戳超時而拒絕服務,所以 DOS 攻擊也是不可能的;

如果簽名算法和用戶名密碼都暴露了,那齊天大聖來了估計也不好使吧...

最後說一句,所有的安全措施都用上的話有時候難免太過複雜,在實際項目中需要根據自身情況作出裁剪,比如可以只使用簽名機制就可以保證信息不會被篡改,或者定向提供服務的時候只用 Token 機制就可以了。如何裁剪,全看項目實際情況和對接口安全性的要求~

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/daeaH3-ABm3DRNIwqcAVsw