接口安全問題
AccessKey&SecretKey (開放平臺)請求身份為開發(fā)者分配AccessKey(開發(fā)者標識,確保唯一)和SecretKey(用于接口加密,確保不易被窮舉,生成算法不易被猜測)。 防止篡改參數(shù)簽名
請求攜帶參數(shù)AccessKey和Sign,只有擁有合法的身份AccessKey和正確的簽名Sign才能放行。這樣就解決了身份驗證和參數(shù)篡改問題,即使請求參數(shù)被劫持,由于獲取不到SecretKey(僅作本地加密使用,不參與網(wǎng)絡傳輸),無法偽造合法的請求。 重放攻擊雖然解決了請求參數(shù)被篡改的隱患,但是還存在著重復使用請求參數(shù)偽造二次請求的隱患。 timestamp+nonce方案 nonce指唯一的隨機字符串,用來標識每個被簽名的請求。通過為每個請求提供一個唯一的標識符,服務器能夠防止請求被多次使用(記錄所有用過的nonce以阻止它們被二次使用)。 然而,對服務器來說永久存儲所有接收到的nonce的代價是非常大的??梢允褂胻imestamp來優(yōu)化nonce的存儲。 假設允許客戶端和服務端最多能存在15分鐘的時間差,同時追蹤記錄在服務端的nonce集合。當有新的請求進入時,首先檢查攜帶的timestamp是否在15分鐘內(nèi),如超出時間范圍,則拒絕,然后查詢攜帶的nonce,如存在已有集合,則拒絕。否則,記錄該nonce,并刪除集合內(nèi)時間戳大于15分鐘的nonce(可以使用redis的expire,新增nonce的同時設置它的超時失效時間為15分鐘)。 實現(xiàn)請求接口:http://api./test?name=hello&home=world&work=java 客戶端
服務端 在APP開放API接口的設計中,由于大多數(shù)接口涉及到用戶的個人信息以及產(chǎn)品的敏感數(shù)據(jù),所以要對這些接口進行身份驗證,為了安全起見讓用戶暴露的明文密碼次數(shù)越少越好,然而客戶端與服務器的交互在請求之間是無狀態(tài)的,也就是說,當涉及到用戶狀態(tài)時,每次請求都要帶上身份驗證信息。 Token身份驗證
安全隱患:Token被劫持,偽造請求和篡改參數(shù)。 Token+AppKey簽名驗證 與上面開發(fā)平臺的驗證方式類似,為客戶端分配AppKey(密鑰,用于接口加密,不參與傳輸),將AppKey和所有請求參數(shù)組合成源串,根據(jù)簽名算法生成簽名值,發(fā)送請求時將簽名值一起發(fā)送給服務器驗證。這樣,即使Token被劫持,對方不知道AppKey和簽名算法,就無法偽造請求和篡改參數(shù)。再結合上述的重發(fā)攻擊解決方案,即使請求參數(shù)被劫持也無法偽造二次重復請求。 實現(xiàn)登陸和退出請求后續(xù)請求客戶端 服務端
|
|
|
來自: 西北望msm66g9f > 《培訓》