還在手動對參數(shù)進行簽名校驗?太落后了吧!
有做過開放平臺的同學肯定知道,對外的 API 都要做簽名校驗,防止重放等來保證安全性。既然是統(tǒng)一的校驗,那就沒必要讓每個開發(fā)接口的同學都去手動的進行校驗,這個時候我們需要統(tǒng)一進行簽名的校驗和重放的校驗。
今天給大家推薦一個 API 校驗的框架,通過注解和切面的方式自動進行簽名校驗,并且支持自定義算法,使用簡單,我強調(diào)一下,大家如果要用于自己的項目中,可以下載源碼稍微改造下,因為我覺得還有些地方?jīng)]有處理好,當然大家可以借鑒這個項目的思路,還是不錯的。
集成框架
可以直接使用作者已經(jīng)上傳了的 jar 包,當然你也可以自己下載源碼編譯。
cn.oever
api-signed
0.0.1
添加配置信息,主要配置加密算法和 Redis 信息,因為這個項目用到了 Redis 做防止重放。
server:
port: 8080
oever:
signature:
time-diff-max: 300
algorithm: HmacSHA1
spring:
redis:
host: 127.0.0.1
port: 6379
password:
time-diff-max:調(diào)用方與服務器時間戳允許的最大差值,單位秒,默認值 10 秒。時間戳校驗肯定會出現(xiàn)客戶端和服務端不一致的情況,我們允許一定的差值,超過了就證明是過期的請求。
algorithm:MAC 算法的標準名稱
spring.redis:就是 Redis 的配置信息,請注意前面加 spring,在作者文檔中沒有加 spring。
在啟動類上添加簽名掃描注解@SignedScan,注解中會做自動裝配的工作。
@SpringBootApplication
@SignedScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
簽名校驗
在要進行簽名的接口上增加@SignedMapping 注解,也可以放在類上。簽名參數(shù)信息可以用框架自帶 SignedParam 類,也可以自定義,自定義的話再自己的類上通過注解的方式標識 appId 等信息即可。
@RequestMapping("base")
@SignedMapping
public String base(@RequestBody SignedParam signedParam) {
logger.info("The request data is :" + signedParam.getData());
return "Base test is ok.";
}
參數(shù)類:
@SignedEntity
public class SignedParam {
@SignedAppId
private String appId;
private String data;
@SignedTimestamp
private long timestamp;
@SignedNonce
private int nonce;
@Signature
private String signature;
}
然后就可以測試接口了,填寫對應的認證信息,簽名需要根據(jù)算法將參數(shù)進行簽名,后端校驗才能通過。

簽名步驟
將請求參數(shù)依據(jù)參數(shù)名稱(首字母小寫)的 ASCII 序進行升序排列, 參與排序的參數(shù)包括除 signature 以外的所有請求參數(shù)。 將排序后的請求參數(shù)依照參數(shù)名=參數(shù)值的形式格式化, 然后將各個參數(shù)依序用&符號拼接在一起, 得到待簽名字符串 plainText。
appId=APP_ID_TEST&data={"userId":"test"}&nonce=-2028703096×tamp=1597415679
以 HMAC-SHA1 算法為例對 plainText 進行加密, 再使用 Base64 對加密后的字節(jié)流進行編碼, 即得到了最終簽名 signature
signature=base64_encode(hash_hmac('sha1', appSecret, true));
項目地址
還有自定義校驗規(guī)則等功能大家就自己去看文檔和源碼吧!
掃下面二維碼,回復000獲取項目地址
