接口安全問題
- 請求身份是否合法?
- 請求參數(shù)是否被篡改菲饼?
- 請求是否唯一?
AccessKey&SecretKey (開放平臺)
請求身份
為開發(fā)者分配AccessKey(開發(fā)者標識列赎,確保唯一)和SecretKey(用于接口加密宏悦,確保不易被窮舉,生成算法不易被猜測)包吝。
防止篡改
參數(shù)簽名
- 按照請求參數(shù)名的字母升序排列非空請求參數(shù)(包含AccessKey)饼煞,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA;
- 在stringA最后拼接上Secretkey得到字符串stringSignTemp诗越;
- 對stringSignTemp進行MD5運算砖瞧,并將得到的字符串所有字符轉換為大寫,得到sign值嚷狞。
請求攜帶參數(shù)AccessKey和Sign块促,只有擁有合法的身份AccessKey和正確的簽名Sign才能放行。這樣就解決了身份驗證和參數(shù)篡改問題床未,即使請求參數(shù)被劫持竭翠,由于獲取不到SecretKey(僅作本地加密使用,不參與網(wǎng)絡傳輸)薇搁,無法偽造合法的請求斋扰。
重放攻擊
雖然解決了請求參數(shù)被篡改的隱患,但是還存在著重復使用請求參數(shù)偽造二次請求的隱患啃洋。
timestamp+nonce方案
nonce指唯一的隨機字符串传货,用來標識每個被簽名的請求。通過為每個請求提供一個唯一的標識符宏娄,服務器能夠防止請求被多次使用(記錄所有用過的nonce以阻止它們被二次使用)问裕。
然而,對服務器來說永久存儲所有接收到的nonce的代價是非常大的孵坚×竿穑可以使用timestamp來優(yōu)化nonce的存儲貌踏。
假設允許客戶端和服務端最多能存在15分鐘的時間差,同時追蹤記錄在服務端的nonce集合窟勃。當有新的請求進入時,首先檢查攜帶的timestamp是否在15分鐘內逗堵,如超出時間范圍秉氧,則拒絕,然后查詢攜帶的nonce蜒秤,如存在已有集合汁咏,則拒絕。否則作媚,記錄該nonce攘滩,并刪除集合內時間戳大于15分鐘的nonce(可以使用redis的expire,新增nonce的同時設置它的超時失效時間為15分鐘)纸泡。
實現(xiàn)
請求接口:http://api.test.com/test?name=hello&home=world&work=java
-
客戶端
- 生成當前時間戳timestamp=now和唯一隨機字符串nonce=random
- 按照請求參數(shù)名的字母升序排列非空請求參數(shù)(包含AccessKey)
stringA="AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random";
- 拼接密鑰SecretKey
stringSignTemp="AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random&SecretKey=secret";
- MD5并轉換為大寫
sign=MD5(stringSignTemp).toUpperCase();
- 最終請求
http://api.test.com/test?name=hello&home=world&work=java×tamp=now&nonce=nonce&sign=sign;
-
服務端
Token&AppKey(APP)
在APP開放API接口的設計中漂问,由于大多數(shù)接口涉及到用戶的個人信息以及產品的敏感數(shù)據(jù),所以要對這些接口進行身份驗證女揭,為了安全起見讓用戶暴露的明文密碼次數(shù)越少越好蚤假,然而客戶端與服務器的交互在請求之間是無狀態(tài)的,也就是說吧兔,當涉及到用戶狀態(tài)時磷仰,每次請求都要帶上身份驗證信息。
Token身份驗證
- 用戶登錄向服務器提供認證信息(如賬號和密碼)境蔼,服務器驗證成功后返回Token給客戶端灶平;
- 客戶端將Token保存在本地,后續(xù)發(fā)起請求時箍土,攜帶此Token逢享;
- 服務器檢查Token的有效性,有效則放行涮帘,無效(Token錯誤或過期)則拒絕拼苍。
安全隱患:Token被劫持,偽造請求和篡改參數(shù)调缨。
Token+AppKey簽名驗證
與上面開發(fā)平臺的驗證方式類似疮鲫,為客戶端分配AppKey(密鑰,用于接口加密弦叶,不參與傳輸)俊犯,將AppKey和所有請求參數(shù)組合成源串,根據(jù)簽名算法生成簽名值伤哺,發(fā)送請求時將簽名值一起發(fā)送給服務器驗證燕侠。這樣者祖,即使Token被劫持,對方不知道AppKey和簽名算法绢彤,就無法偽造請求和篡改參數(shù)七问。再結合上述的重發(fā)攻擊解決方案,即使請求參數(shù)被劫持也無法偽造二次重復請求茫舶。
實現(xiàn)
登陸和登出請求
后續(xù)請求
客戶端
和上述開放平臺的客戶端行為類似械巡,把AccessKey改為token即可。-
服務端