为什么微信支付API必须签名

  1. 微信支付的API使用https传输,已经可以保证完整性和传输加密,为什么在报文中,又要求做一次签名呢? 直接传递用户名和密码不行么?

    补充:https还需要防范中间人攻击; 对内容再次进行签名可以防范中间人攻击。

    但是,如果客户端正确校验服务端证书的合法性, 也可以有效防止中间人攻击,但为什么几大部分的支付类API都选择了对内容进行签名呢?

  2. 微信支付的退款API需要客户端安装商户证书,服务端会要求进行客户端证书认证。问题是,既然有了https + 签名, 已经可以保证完整性、机密性和抗抵赖,再加一个客户端证书认证是什么目的呢?

附上微信的开发文档

阅读 8.4k
2 个回答

大概是为了更严格的安全吧。

新手上路,请多包涵

一般来说https保证的是完整性和保密性,而还有一个更重要的需求是: 身份认证,即请求确实是由你发出的而不是别人伪造的,这要求传输内容中必须包含只有你才能生成的可验证的信息,具体来说这可以通过两种方式来做到:
1.通过在传输内容中加入具有密码性质的信息,比如使用你的appsecret来生成的一个签名(微信的做法),其实甚至也可以直接将appsecret明文作为内容的一部分传输,只是这样有点low,而且真的如果客户端代码或环境出现问题,明文secret泄露就完蛋了
2.通过客户端证书来认证,每个人发不同的客户端证书,那这个证书就相当于你的密码,而相对于appsecret泄露,客户端可以一次性安装到服务器,相对于appsecret泄露的可能性更低,安全性也更高
所以,回到问题,签名更多的是为了认证,客户端证书提供双重泄露保护,另外,还需要考虑时间先后问题和历史原因,我不确定微信早期是否有强制客户使用https方式(包括客户端发起的api调用和微信端发起的支付回调),如果没有,那这种签名方式自然是更必要的,提供基于http的数据完整性。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题