乔治于2021年03月20日 支付宝 微信 支付 安全 数字签名 RSA 密钥对

仅仅在API层面,不涉及财务会计,金融监管等等方面,仅仅从安全角度考虑,支付API的大部分繁琐工作都在保证你就是你的身份问题。 这个在新接入一家支付通道的时候感受非常明显。身份问题典型的解决方案就是基于非对称加密的数字签名技术。

支付安全

在一个支付流程中可能涉及的角色有平台用户,商户,平台,应用,商户用户等。整体上是一个三方参与的过程,比较复杂。支付也是一个异步流程,从商家的角度至少需要2步以上才能完成支付:

  1. 首先是商家调用平台API发起支付

  2. 平台引导用户在平台上完成支付

  3. 平台向商家发起支付结果通知的回调请求。

用户在支付平台上付款的事情是支付平台自己处理的,作为没有支付牌照的商家是不需要操心这部分的,暂时略过。 剩下的两步骤都需要请求发起方向请求接收方证明你就是你.

  1. 商家调用平台API发起支付的时候的得告诉平台是谁在收钱。

  2. 平台向商家发起回调请求的时候商家需要知道是平台在发起回掉。

只有这样商家才放心说钱一定会收到的(毕竟每笔交易你都没查银行账户确认),平台也有凭证说商家已经把钱收了,用户确信商家是会履约的。这是一个双向的严格的安全要求。这就是为啥调用支付API要申请应用,要生成证书,要验签名等。

第1个商家向平台证明自己的身份使用OAuth相关的技术。以支付宝为例,你要对接先申请一个应用,拿到一个APP ID和APP Secret,熟悉OAuth的人可能都马上能联系到开放平台的事情。APP Secret一定要保管好,不能泄漏。 貌似这一步也可以支持证书认证。

第2个平台向商家证明自己的身份使用证书相关的技术。这就是我们需要下载平台的支付证书(其实是个公钥)的原因。这是用来回调验证签的。

严格来收这里面并没有用到想HTTPS那样的证书,而仅仅是非对称加密算法中的公钥-私钥的密钥对,然后这就是一个数字签名的过程。不像HTTPS,这中间也没有知名的证书机构(CA)参与。

HTTPS不能保证这个吗?

虽说HTTPS逐渐普遍起来了,但是也不能完成保证支付安全的问题。因为HTTPS只能保证请求接收方的身份问题,不能确认请求发起方的身份问题。

注:其实HTTPS也支持客户端证书,开启之后就可以完成双向证书验证了。不过大部分情况下只是用服务端证书,而不启用客户端证书。

以支付宝为例,也就是是说我们访问 https://openapi.alipay.com/gateway.do 成功后请求发起方能确认访问的就是支付宝的支付接口,但是支付宝支付平台不能安全的知道是谁在发起支付请求。

相应的支付回调也是类似的,支付宝发起HTTPS的回调,只能知道是访问了商家的回调地址,而商家不能安全的确信这就是支付宝发起的回调。

而且上面的方案在非HTTPS的环境也是可以工作的。

参考