【Java項目】基于Spring AOP + Redisson技術(shù)實現(xiàn)接口簡單鑒

【Java項目接口簽名技術(shù)實現(xiàn)】
概述
在為第三方系統(tǒng)提供接口的時候,肯定要考慮接口數(shù)據(jù)安全問題,比如數(shù)據(jù)是否被篡改,請求是否已經(jīng)過時,請求是否允許重復(fù)提交等問題。
設(shè)計思路
因此接口簽名主要解決如下幾個問題:
1、前端請求必須在規(guī)定時間范圍內(nèi)才生效;
2、請求發(fā)起方必須是已經(jīng)被授權(quán)的應(yīng)用;
3、請求不能夠被重復(fù)發(fā)起;
4、請求發(fā)起時傳入的參數(shù)不能夠被篡改。
接口簽名規(guī)則
在header中加入4個參數(shù):

第三方請求合法性
線下分配appid和appsecret,針對不同的調(diào)用方分配不同的appid和appsecret
單次請求失效性
加入timestamp(時間戳),5分鐘內(nèi)數(shù)據(jù)有效
請求判重
加入流水號(隨機(jī)數(shù))nonce(防止重復(fù)提交),約定為10位。 在有效期內(nèi)的唯一性,為避免重復(fù)請求,放入緩存,5分鐘過期
接口參數(shù)加密
加入sign,所有數(shù)據(jù)的簽名信息,sign字段生成規(guī)則如下:
將RequestBody中的參數(shù)序列化為SortedMap<String, String>,所有key=value進(jìn)行拼接,按照key字典序排序為一個字符串,然后進(jìn)行MD5加密,org.springframework.util.DigestUtils.md5DigestAsHex()
驗簽邏輯
將appid、timestamp、nonce、sign 4個字段再次按照key字典序排序,然后進(jìn)行MD5加密,org.springframework.util.DigestUtils.md5DigestAsHex(),得到字符串,再通過sun.misc.BASE64Encoder.encode(signStr),得到最終驗簽字符串。