本文来自作者投稿,原作者——南山狮:理工男,7年互联网电商系统开发经验,知识分享领域探索小白。公众号:南山狮,白话文帮助你了解编程。
讲安全之前,先聊聊一个信息传输的故事
A君和B君通讯,直接用明文发消息,觉得不安全。用同一个秘钥加密解密(对称加密),就可以做到简单加密。
 (图片来源:https://www.ancii.com/axjndxg8u/ )
但是秘钥发给对方,也可能被监控,不安全。所以又想出一种新的加密方式。
A君和B君都创建自己的公钥秘钥,然后A君把自己公钥公开给B君,B君把自己的公钥给A君,A君用B君的公钥加密信息发给B君,只有B君用私钥才能解密。公钥就算给其他人窥探到,也不会造成泄密,这也就是非对称加密。

但非对称加密比对称加密慢多了,所以一般先用非对称加密获取秘钥,再使用对称加密传输。
而且还会有中间人攻击。例如A君把公钥给B君的时候,中间还有一个C君窃取并把公钥改成自己的公钥。B君用C君的公钥加密,传输,C君用自己的私钥解密窃取,再用A君的公钥重新加密给A君,A君和B君都感觉没问题,其实信息都被C君窃取了。
其实上面讲的其实就是HTTPS加密的一些过程,最后是采用CA证书解决,信任官方的证书。也就是怎么证明B君的公钥,就是B君的。
B君发送公钥的时候,会把公钥和一些盐值(随机字符串)通过HASH(不可逆)加密成一个所谓的报文摘要。通过报文摘要和公钥对比,就可以判定公钥是否有被篡改。但还不够,因为整个报文摘要有可能被一起改了。

这时候CA就起作用了,把消息摘要和CA的私钥一起加密,形成所谓的数字签名,就是避免消息摘要被篡改。数字签名+B君的公钥盐值,就是我们常听的数字证书。
验签验密
看完上面的故事,你应该了解什么是对称加密,什么是非对称加密,什么是HASH加密,所有的代码层面的安全措施基本都是基于以上几点来实现的。
一些小商户,会做最简单的加密方式,就加一个随机字符串作为签名来传输,接收方判断是否一致。当然,这种方式极其不安全,只要窃听到签名,就可以仿造请求了。
像qq音乐,要求对一些重要的参数(例如流水号,充值账号)做一个简单的对称加密(例如DES),避免数据在网络上明文传输。
然后重点讲一下签名,签名的玩法有很多种,但还是会有相似之处。
首先,签名必须要跟参数有关,任何一个参数修改了,都会改变签名,所以如果只窃听到签名,也不能直接用相同的签名去模拟请求。
常用的方法,将业务参数按参数名 key 的字母表顺序排列后,以 key=value的形式组合,并用&符号连接,得到待签名字符串,a=a1&b=b1&c=c1;
有些,会在这签名字符串后面加盐值(双方约定的随机字符串),a=a1&b=b1&c=c1&secretKey
这之后的加密方法,就比较多了。像腾讯视频和网易云音乐都是使用SHA256WithRSA,就是base64encode(rsa(sha256(签名原串), 私钥)),HASH加密(sha256)+ 非对称加密(rsa),有点像前面故事讲到的 数字签名,也是需要双方交换公钥。
为什么加了HASH加密,还要非对称加密,就是和上面故事讲的一样,避免整个签名都被篡改了,只是没有数字签名而已。
再严格一点的,像网易云音乐,会对返回的结果也加一层非对称加密,接收者需要用自己的私钥解密。
总的来说,大厂做的手段基本都跟HTTPS加密原理差不多,重要参数做对称加密,签名跟参数关联,加盐值,做HASH加密和非对称加密,再对返回结果做非对称加密,做到这一步,基本破解的难度就很高了。当然,做到这一步,对接难度也提高了不少,最起码要做到签名跟参数关联加盐值并且加一层HASH加密,这也是中小商户用的比较多的签名算法。
还有其他手段
除了代码手段,还有其他网络手段来做安全策略,例如IP白名单,一些银行交易相关的话,会用网络专线,提高网络效率和安全,当然成本也很高,所以看业务,一般做到IP白名单就差不多了。
网络专线就是为某个机构拉一条独立的网线,也就是一个独立的局域网,例如军事,银行等,让用户的数据传输变得可靠可信,专线的优点就是安全性好,QoS 可以得到保证。不过,专线租用价格也相对比较高,而且管理也需要专业人员。
还有HTTPS也是必须的,从第一个故事里面,你就可以知道这里加密的安全度有多高多重要,也是重要的手段。
流水号幂等还是不得不讲
曾经接过一些小商户,充值接口连流水号都没有!因为网络的不确定性,有可能请求过去了,但是返回的数据超时或者丢失了。这时接收者不知道结果,就需要用相同的流水号重新尝试或者查询,合作方要保证幂等,也就是如果这个流水号如果已经充值成功了,就直接返回成功,不需要再充值一次,这就是流水号幂等的重要性,可以避免重复发送和之后的对账。