之前看到v2ex上的一个帖子https://www.v2ex.com/t/326285,然后回想一下对接支付宝和微信的时候,其实都有过类似的处理。

于是想整理一下我对数据传输安全的理解。

名词定义

先看看几个名词定义

mac: 消息认证码 Message Authentication Code

hmac: 密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)

数据传输安全

安全

数据安全首先就是保证数据不被第三方得到,那么就得对数据进行加密,那么其实https干的就是这个事情。https保证了server的可靠性,也对数据进行了加密,所以首先应该尽量使用https。

防篡改

首先就是对于webhook这种通知类的请求,就比如说是支付宝某个订单支付成功了,异步通知我的服务器这个订单支付成功了,即便我们使用了https,也无法知道这个通知是支付宝服务器发起的。

https 是在传输层保证了数据安全,那么在某些情况下

  • 使用的依然是http
  • 虽然外部使用了https,但是进行了负载均衡,负责负载均衡的服务器之间依然使用http传输,见知乎讨论
  • 某些支付相关的重要数据,不能单单依赖传输层,应用层依然需要保证数据安全

这些时候就需要我们自己做签名的处理,参考微信签名算法支付宝签名算法

自己实现的 composer 包用于签名

https://github.com/liyu001989/signature

参考链接