天天看點

公共平台API鑒權安全驗證

api使用簽名+時間戳鑒權 請求api接口格式:/api/testserver?appid=xxx&sign=12AA12SD123SD1DSSA&timestamp=1511332935&key1=value1&key2=value2...

參數解釋: appid: 由服務端配置設定唯一标示id 必傳 确認通路身份 timestamp:目前時間戳 必傳 確定通路實效性(10位的秒級時間戳) sign:簽名 必傳 驗證接口安全防止被劫持修改參數

notice:随機數                          必傳 防止接口重複送出

簽名生成規則: 所有請求參數(包括appid,時間戳,随機數   ) 根據key值的字母升序排序後,以key1value1key2value2。。。的方式連接配接在 最後加上secretKey(由服務端配置設定唯一的加密參數,ps:不參與通信)組成的字元串 使用MD5加密轉為大寫得到sign(簽名)

因為secretKey在求情過程中不參與通信,服務端通過對sign的 校驗就可以防止接口被劫持修改參數,再加上時間戳保證接口的實效性。

服務端驗證簽名和時間戳有效後,将sign和notice存入緩存。

請求執行個體: 如要請求的api為 /api/getUserWalletInfo api需要傳的參數為:userId

step1:生成時間戳 String timestamp= String.valueOf(new Date().getTime() / 1000); // 目前時間的時間戳 step2: 根據參數生成sign String sb= appidxxxtimestamp1511332935userId1000secretKey 然後對sb進行md5加密轉為大寫 得到sign step3:組合通路參數進行http請求:/api/getUserWalletInfo?appid=xxx&sign=12AA12SD123SD1DSSA&timestamp=1511332935&notice=2332&userId=100

服務端驗證邏輯:

先驗證appid是否合法(不合法傳回400),時間戳是否有效(過期傳回400),緩存中sign對應的notice是否存在(如果存在代表重複送出,如果不存在将sign和notice存入緩存。),再驗證sign時候正确(不正确傳回400)

簽名生成與校驗移步:點選打開連結