总的来说,还是要看开发者比较在意哪方面的安全,才好考虑如何防护:
1、想要保证程序中的信息不被截取
几乎是不可能的,因为即使再加密,密文也总要变成明文供业务逻辑来使用,攻击者只要盯住这个点就能达到目标;
2、想保护服务器的资源
客户端在相当程度上只是一个UI展现,即使被破解也不是那么重要的,真正重要的是服务器端的资源,那么就要在网络层进行防护了。现在大家都比较喜欢用http,而且都集中喜欢使用AF、ASI等几个开源库,逆向者只要盯住这几个口,就能把来往的request+response全部获取,进而可以仿制一个客户端,此时服务器的资源也就全面开放了。同样的,使用AsyncSocket也是一回事。
此时有3种防护措施:
1)服务器控制,不允许同一IP/客户端频繁抓取数据;
2)对url加上token、timestamp,甚至url编码,虽然碰上高手还是不能100%安全,但是破解者想要达到目的,就需要考虑付出的精力是不是值得了;
3)传输数据加密,并且将加解密的代码层级加深,尤其是放到C或block函数中,这样又将安全等级提高了一级。
3、想保护程序不被伪造或克隆
克隆/伪造其实是件非常容易的事,甚至都不需要太多逆向工作,只要能把网络请求搞定,剩下的就是代码量、以及是否比被仿者做的更好的问题了。
总的来说,客户端没太多可保护的空间,它应该就是个业务展现和数据解析的工具,与其花精力想防这个防那个,不如把精力放在网络接口的保护上,尤其是加解密代码提取到C或block中。
以上只是笔者个人的一些经验,希望大家能多多补充。
附:微信的安全防护措施,笔者认为是比较值得学习的,他们的步骤是:
1、不在业务表现上做太多无用功
除了代码结构比较庞大之外,微信没有做特别的动作;
2、服务器控制
所有的决断性的动作由服务器控制,几乎不可能靠通过篡改客户端的代码来获取更大的权限。笔者曾经针对每天20个漂流瓶的限制尝试扩大权限,但是即使把本地代码逻辑放开,在超过20个瓶子之后,再捞回来的永远是海星,显然是服务器控制住了。
当然,本地LBS坐标是无法被服务器控制的,这也就是坐标穿越插件能起作用的根本原因。
3、网络数据加密
通过对网络接口的拦截,虽然能得到socket收取的二进制数据,首先是无法直接解密,其次是从那许多代码中找解密代码非常费劲,纵然加解密都能搞定,想伪造也十分麻烦,packet中包罗了相当多的信息,我估计就是把他们的代码开放给开发者,想理清这一部分都不是一件轻松的事情。
4、登录唯一性
即使能够伪造微信的请求,一旦登录获取数据,原账号就会被踢下线并且得到通知,这本身就是一个安全警告,说起来也算是服务器控制。
如果开发者对于安全性的设计都能达到微信这一级别,安全级别就是比较值得信赖的了,但是这也不表示就解不出来,只要逆向者的水平达到熟练程度以上(自然是越高越好),并且愿意投入大量精力在某个他们认为值得的app上,几乎都能攻的下来。
作者:Exia_L
链接:http://www.jianshu.com/p/c3b41c3f6692
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。