Android App网络通信安全

前提

没有100%的安全,我们做的只是提高破解的成本,当成本比破解得到的金钱高的时候,自然没有人愿意破解了

场景

我们的接口协议被破,破解者通过程序直接刷我们的新增用户,通过邀请机制获取积分。

问题引出

如何保证和接口通信的就是我们的客户端,而不是别人,或者更深的一层,如何保证客户端和服务器通信的就是彼此,没有第三方。

根据问题得出要做到以下几点

  1. 数据不被篡改
  2. 数据只有双方才能看懂
  3. 数据具有时效性

如何保证数据不被篡改

加上数据完整性的校验签名(前提是只有客户端才能生成这个检验签名)

如何使数据只有双方才能看懂

使用加密算法(前提是只有客户端才能生成校验签名)


能做到以上两点,网络通信就没有基本问题了。
但是,以上两点都有个非常重要的前提,也是一个非常困难的前提

只有客户端能生成一些东西

数据具有时效性

加入加密过的时间戳(前提是只有客户端才能生成这个时间戳)

如何保证客户端生成一些东西

使用C写生成的逻辑,不使用Java

Java是非常容易反编译的语言,即使混淆了,一些常量也是无法混淆的,所以当反编译的时候非常容易通过搜索来找到对应的常量。但是C不一样,C写的东西反编译后是汇编代码,汇编代码并不是多少人可以看得懂的,一定程度上提高了破解的成本。

对调用者进行校验

Android的so库,如果不对使用者进行校验,使用的人可以新建一个一样包名的应用,然后调用我们的so库,一样可以知道对应的输入输出。我们这里在C库里做了对签名的校验,如果发现签名不是我们的,就会用另外一条密钥对数据进行加密。

总结

要想网络协议不被破解,App必须要能够有一个黑匣子一样的东西,让人无法破解,最常用的办法就是把安全逻辑的代码写入到C库中,并对C库进行校验。

延伸和拓展

  1. 对C库代码进行混淆,提高反编译难度
  2. 没有100%的安全,做好行为监控才是王道,如果一个用户压根就没有点开过这个页面,却收到了这个页面的请求,这点足够怀疑这个请求的来源了。