為開發者分配AccessKey(開發者標識,確保唯一)和SecretKey(用於接口加密,確保不易被窮舉,生成算法不易被猜測)。
參數簽名
請求攜帶參數AccessKey和Sign,隻有擁有合法的身份AccessKey和正確的簽名Sign才能放行。這樣就解決瞭身份驗證和參數篡改問題,即使請求參數被劫持,由於獲取不到SecretKey(僅作本地加密使用,不參與網絡傳輸),無法偽造合法的請求。
雖然解決瞭請求參數被篡改的隱患,但是還存在著重復使用請求參數偽造二次請求的隱患。
timestamp+nonce方案
nonce指唯一的隨機字符串,用來標識每個被簽名的請求。通過為每個請求提供一個唯一的標識符,服務器能夠防止請求被多次使用(記錄所有用過的nonce以阻止它們被二次使用)。
然而,對服務器來說永久存儲所有接收到的nonce的代價是非常大的。可以使用timestamp來優化nonce的存儲。
假設允許客戶端和服務端最多能存在15分鐘的時間差,同時追蹤記錄在服務端的nonce集合。當有新的請求進入時,首先檢查攜帶的timestamp是否在15分鐘內,如超出時間范圍,則拒絕,然後查詢攜帶的nonce,如存在已有集合,則拒絕。否則,記錄該nonce,並刪除集合內時間戳大於15分鐘的nonce(可以使用redis的expire,新增nonce的同時設置它的超時失效時間為15分鐘)。
請求接口:http://api.test.com/test?name=hello&home=world&work=java