加解密注意事项


        为了数据安全,首信易支付接口综合使用了两种加密方法、两种签名方法以及一种排序方法,分别是:CFCA公钥证书加密、AES加密、SHA1签名、CFCA私钥证书签名和键名首字母排序。

1. 证书使用规则:

商户使用自己的正式商户编号时,证书使用情况如下:
导出的公钥证书.cer需要上传至商户后台,
程序中公钥使用SDK demo中的公钥.cer,
程序中私钥pfx以及私钥密码换成下发证书后导出的私钥.pfx和导出时设置的私钥密码。

2. 加密流程简述:

1、按a-z顺序排列键名,对应的键值中间用#进行拼接,示例:1#2#3#(“#”尾加首不加,空值不参与签名)
2、进行SHA1 签名
3、商户下载导出的CFCA私钥.pfx对第2步生成的字节流结果再签名, 将结果做为hmac值
4、由商户随机生成十六位AES密钥
5、用第4步的AES密钥对加入了第3步hmac后的请求数据JSON串进行加密
6、用首信易SDK demo里提供的CFCA公钥.cer加密第4步的AES密钥
7、把第5步加密完成的密文set到请求体里
8、把merchantId、requestId、encryptKey(第6步加密后得到的数据)传入请求头
9、http post请求接口

3. 解密流程简述:

返回数据和请求数据是相同的格式,按照请求流程的逆推进行解密以及验签。
1、接收post请求,获取返回头的encryptKey ,返回体 data
2、用商户下载导出的私钥.pfx解密第1步的encryptKey 得到十六位的 AES密钥
3、用第2步的AES密钥解密第1步的data
4、将第3步得到的原数据 JSON去掉hmac,按a-z顺序排列键名,对应的键值中间用#进行拼接,示例:1#2#3#(“#”尾加首不加,空值不参与签名)
5、进行SHA1 签名
6、用首信易提供的SDK demo里的CFCA公钥.cer对第3步得到的数据中的hmac进行验签,即和第5步的结果比较,以保证数据没有被篡改。

4. 注意:

1、拼接hmac后的JSON经AES加密后的密文直接放在data中,data不是JSON也不要嵌套。
2、SHA1前要UTF-8编码。SHA1后的字符串不要进行base64,直接签名。
3、Java demo中需要配置公私钥路径与商编。
4、PHP demo中加解密注意版本问题,如果出现方法不支持,7.0以上版本请参考境内收单接口所在PHP SDK demo的 forma2中的注释部分。


加密简易图解

解密简易图解