1、
数字签名
为了保证数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接收签名数据之后进行签名校验。
数字签名有两个步骤,先按一定规则拼接要签名的原始串,再选择具体的算法和密钥计算出签名结果。一般失败的结果不签名。
(1)签名原始串
无论是用get、post还是xml,签名原始串组串方式都一致,除sign字段外,待签名参数按照字段名的ascii码从小到大排序后使用QueryString的格式(即key1=value1&key2=value2?)拼接而成,空值不传递,不参与签名。
签名时字段名和字段值都采用原始值,不进行URL Encode。
签名的字段包括请求中有所的get或post字段,除了接口中描述的字段外,还应包括请求中出现的其它字段。
目前仅支持SHA256withRSA签名算法
(2)签名算法
(3)签名(伪代码)
数字签名= Base64_encode ( SHA256withRSA_sign ( 签名原始串 ,商户私钥.pfx) )
(4)验签(伪代码)
验签 = SHA256withRSA_verify ( 签名原始串 , Base64_decode(数字签名 ) ,易票联公钥.cer )
(5)商户证书安全
证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载。商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件。
2、
商户回调API安全
在普通的网络环境下,HTTP请求存在DNS劫持、运营商插入广告、数据被窃取,正常数据被修改等安全风险。商户回调接口使用HTTPS协议可以保证数据传输的安全性。所以微信支付建议商户提供给微信支付的各种回调采用HTTPS协议。