加簽、驗簽的作用
常見的http請求交互過程中,請求參數通過url或者request body等形式傳輸。但是由於http請求的開放性,使得請求參數很容易被攔截篡改。因此,需要對請求參數進行加簽,然后在請求接受方對請求參數進行驗簽,確保兩個簽名是一樣的,驗簽通過之后請求處理方就可以進行業務邏輯處理了。
但是,加簽和驗簽只能解決請求傳輸過程中參數篡改的問題,並不能解決敏感參數傳輸的安全性問題。
加簽、驗簽的處理思路
加簽和驗簽就是在請求發送方將請求參數通過加密算法生成一個sign值,放到請求參數里;請求接收方收到請求后,使用同樣的方式對請求參數也進行加密得到一個sign值,只要兩個sign值相同,就說明參數沒有被篡改。
簽名參數sign生成的方法
- 將所以頭參數(注意時所有參數),出去sign本身,以及值是空的參數,按參數鍵字母升序排序。
- 然后把排序后的參數按參數1值1參數2值2......參數n值n(這里的參數和值必須是傳輸參數的原始值,不能是經過處理的,如不能將"轉成"后再拼接)的方式拼接成一個字符串。
- 把分配給接入方的驗證密鑰key拼接在第2步得到的字符串前面。
- 在上一步得到的字符串前面加上密鑰key(這里的密鑰key是接口提供方分配給接口接入方的),然后計算md5值,得到32位字符串,然后轉成大寫,得到的字符串作為sign的值放到請求參數里。
舉例
現在假設需要傳輸的數據是:http://xxx.com/api/guest/rechargeNotify?p2=v2&p1=v1&method=cancel&p3=&pn=vn(實際情況最好是通過post方式發送)
- 拼接字符串,首先去除值是空的參數p3,剩下p2=v2&p1=v1&method=cancel&pn=vn,然后按參數名字符升序排序得到字符串:method=cancel&p1=v1&p2=v2&pn=vn。
- 然后做參數名和值的拼接,最后得到methodcancelp1v1p2v2pnvn。
- 在上面拼接得到的字符串前面加上驗證密鑰key,假設是abc,得到新的字符串abcmethodcancelp1v1p2v2pnvn。
- 將上面得到的字符串進行md5計算,假設得到的是abcdef,然后轉為大寫,得到ABCDEF這個值即為sign簽名值。最終產生的url應該如下:http://xxx.com/api/guest/rechargeNotify?p2=v2&p1=v1&method=cancel&p3=&pn=vn&sign=ABCDEF
- 注意:計算md5之前請確保請求發送方和接收方使用的字符串編碼一致,比如統一使用utf-8編碼,如果編碼方式不一致則計算出來的簽名會校驗失敗。
驗簽過程
其實就是將請求url按照上述的規則進行同樣的操作,計算得到參數的簽名值,然后和參數中傳遞的sign值進行對比,如果一致則校驗通過,否則校驗不通過。