4 數字簽名

為了保證數據傳輸過程中的數據真實性和完整性,我們需要對數據進行數字簽名,在接收簽名數據之後進 行簽名校驗。

數字簽名有兩個步驟,先按一定規則拼接要簽名的原始串,再選擇具體的演算法和密鑰計算出簽名結果。

一般失敗的結果不簽名。

4.1 簽名原始串

無論是請求還是應答,簽名原始串按以下方式組裝成字串:

1、除 sign 字段外,所有參數按照字段名的 ascii 碼從小到大排序後使用 QueryString 的格式(即 key1=value1&key2=value2…)拼接而成,空值不傳遞,不參與簽名組串。

2、簽名原始串中,字段名和字段值都採用原始值,不進行 URLEncode。

3、返回的應答或通知消息可能會由於升級增加參數,請驗證應答簽名時注意允許這種情況。

舉例:

調用某個接口,接口有如下字段:

<xml>
<date><![CDATA[20170406]]></date> 
<fee_type><![CDATA[USD]]></fee_type> 
<mch_create_ip><![CDATA[127.0.0.1]]></mch_create_ip> 
<mch_id><![CDATA[7551200001]]></mch_id> 
<nonce_str><![CDATA[1491451488]]></nonce_str>
<service><![CDATA[unified.tools.queryexchagerate]]></service> 
<sign><![CDATA[BA8E728926DCE785426AF9DB142CB7EB]]></sign> 
<sign_type><![CDATA[MD5]]></sign_type> 
<query_channel><![CDATA[weixin]]></query_channel> 
</xml>

正確的簽名字段排序為:

date=20170406&fee_type=USD&mch_create_ip=127.0.0.1&mch_id=7551200001&nonce_str=
1491451488&service=unified.tools.queryexchagerate&sign_type=
MD5&query_channel=weixin&key=57e4e7fec481a56feb12d0d5

4.2 簽名演算法

目前暫只支持 MD5 簽名

MD5 簽名

MD5 是一種摘要生成演算法,通過在簽名原始串後加上商戶通信密鑰的內容,進行 MD5 運算,形成的摘要字串即為簽名結果。為了方便比較,簽名結果統一轉換為大寫字元。注意:簽名時將字串轉化成位元組流時指定的編碼字元集應與參數 charset 一致。

MD5 簽名計算公式: sign = Md5(原字串&key=商戶密鑰). toUpperCase

如:

假設以下為 XML 傳入參數:

<xml>
<date><![CDATA[20170406]]></date> 
<fee_type><![CDATA[USD]]></fee_type> 
<mch_create_ip><![CDATA[127.0.0.1]]></mch_create_ip> 
<mch_id><![CDATA[7551200001]]></mch_id> 
<nonce_str><![CDATA[1491451488]]></nonce_str> 
<service><![CDATA[unified.tools.queryexchagerate]]></service> 
<sign><![CDATA[BA8E728926DCE785426AF9DB142CB7EB]]></sign> 
<sign_type><![CDATA[MD5]]></sign_type> 
<query_channel><![CDATA[weixin]]></query_channel> 
</xml> 

假設商戶密鑰為:57e4e7fec481a56feb12d0d5 
i:經過 a 過程 URL 鍵值對字典序排序後的字串 string1 為: 
date=20170406&fee_type=USD&mch_create_ip=127.0.0.1&mch_id=7551200001&nonce_str=1491451488&service=unified.tools.queryexchagerate&sign_type=MD5&query_channel=weixin 

ii:經過 b 過程後得到 sign 為: 
sign =md5(string1&key=57e4e7fec481a56feb12d0d5).toUpperCase
=md5(date=20170406&fee_type=USD&mch_create_ip=127.0.0.1&mch_id
=7551200001&nonce _str=1491451488&service=unified.tools.queryexchagerate&sign_type=MD5&query_chan nel=weixin&key=57e4e7fec481a56feb12d0d5).toUpperCase()
="83684D9546F261997EFF2ECFAC372583"