前面几章主要关注点是在防篡改和防重放之上,但是通信过程我们仍然可以通过Charles抓包来查看和窃听。

为了解决数据传输安全,防窃听,通常想到的是对传输的数据进行加密,服务端进行解密。

# 自实现加解密

以前刚工作那会,没啥经验的时候,就自己去写加解密算法,然后把算法搞的自认为很复杂,客户端那边还要考虑如何把这个加解密用的密钥给隐藏起来。

这种做法,也不是说不可以,只是我们要想想这种方案的缺点。

  1. 无论是客户端还是服务端,加解密操作需要自己实现,也就是自造轮子。研发成本高、周期长、不稳定。
  2. 自造轮子,后期用户量大,需要做集群的时候不方便。像SSL可以部署在单机上、部署在网关上,也可以部署在负载均衡器上。
  3. 自实现算法性能问题是需要考虑的,对称算法性能好一些,但密钥存储不好搞。非对称算法密钥安全些,但算法性能不好。

# SSL

HTTPS是目前成熟并广泛应用的数据传输安全解决方案,目前普遍用的是RSA的算法,简单的说一下大概过程。

  1. 服务端有一对RSA的公私钥。
  2. 客户端发起请求前,服务端将证书发送给客户端,证书里带了服务端的公钥及签名。
  3. 客户验证证书,然后使用服务端的公钥对后续数据传输进行加密,并与服务端协商一个数据加解密算法。
  4. 后续数据传输的时候,就采用协商好的密钥进行加解密。

基本原理是这样的,详细的,大家去搜索一下。原理有点像密钥协商,协商一组对称密钥及对称加密算法,协商完后,后续通信就用协商好的密钥对数据传输进行加解密。

# SSL应用注意事项

SSL应用时,服务端的证书发送到客户端的时候,客户端需要对证书的合法性进行验证。为了验证证书的合法性呢,会引入第三方机构,机构使用它的私钥对服务端的公钥生成一个签名,生成一个证书,客户端用第三方机构的公钥去校验签名是否正确,也即防证书被篡改。这个第三方机构就是我们所说的可信CA。

很多安卓或iOS的同学,为了省事呢,都会直接信任所有证书,这是非常危险的。如果信任所有证书,那么在与服务端交互过程中,窃听者只要拦截客户端的请求,并把证书篡改成自己的,那么客户端其实是不知道与自己通信的是不是真的服务端。

同样的,对于安全级别要求较高的系统,通常会开启双向认证,即客户端要验证服务端的证书,同时服务端要验证客户端的证书。

# 国密SSL

近期有一部分系统,也在推进国密算法SSL的改造,为提升系统安全性,有条件改造的,也可以尝试一下,可提高系统安全性,毕竟考验各类工具的支持、窃听者的知识积累。

国际算法已经很普遍了,工具齐全,经验够多,哪里不严谨,别人很容易钻空子。

# 自签证书能不能用

有一些同学可能会顾虑自签证书能不能用的问题,我发表一下我的观点,欢迎指正。

我觉得自签证书和其它机构签的证书,本质是一样的,自签证书能不能用,主要还是看面向的客户群和应用场景。我觉得以下情况完全可以用自签证书。

用户仅使用移动端,未使用到PC端,或者PC端仅内部用。 PC端如果不是用浏览器,而是其它软件,也可以用自签证书

其实第三方机构证书,就是省掉了让用户去安装CA证书这步,因为浏览器或系统一般会内置一些可信的CA。