Android免费培训QQ群(118949422)第二期专题培训

(转载请注明出处,商用请与本人联系)

1. 首先我们思考一个问题,Android中哪些部分需要提高安全性防止被破解,哪些部分无法保证安全?

a) 首先,如果你的应用跟其他人竞争的是创意、用户体验、服务等等偏软的东西,同时是免费的,并没有什么技术难点,要评估一下是否确实需要提高代码的安全性。

b) 对于图片、xml文件或者apk文件本身是无法加密的。因为这些文件是由Andriod虚拟机加载和读取,加密后Android虚拟机无法识别,你的应用也无法正常使用了。如果有需要保密的内容,不要放到这些文件里。

c) 有很多Android应用需要与服务端做数据通信,如果传输的数据做了加密,那么客户端加密或解密可能会使用到密钥,这个密钥最好是动态的。

d) 关键的业务逻辑、算法和涉及到金融交易的部分,需要极高的安全性,必须多种加密方法并用。

2. 防止代码被反编译的几种方法:

a) 尽量减少客户端代码中的敏感内容,例如加密算法的key

要想完全不被破解是不可能的,微软苹果这样的公司,一样会被破解越狱。我们只能想办法提高被反编译的难度,提高被破解的门槛。

首先让敏感的内容尽量在服务端,而不是放到客户端,密钥用动态的。不要自己给自己埋下祸根,尽量不要留下会被破解的可能性。墨菲定律说,一件坏事如果可能发生,那么它一定会发生。

b) 自定义类加载器(Custom ClassLoader)

通过自定义类加载器,可以加载加密过的.class文件,在加载时使用自定义的类加载器解密的方式提高代码的安全性。

这种方式在有机会使用自己的类加载器的场景下可以使用,例如C/S架构的程序,客户端是Java编写的(Swing或SWT),这种程序在大公司和国外较常见,国内小公司很少会用Java来写客户端。

对于Android程序,对于继承Android的Activity、Service等基类的子类,无法使用类加载器,如果要使用,那么需要把关键的代码抽离出来,独立成一个与Android框架无关的类,这样可以使用自定义的类加载器来加载。

但这里仍然有隐患,因为这个自定义的类加载器也是java编写的,也会被反编译。只不过这样处理后又增加了一道屏障,提高了被破解的难度。

c) 使用JNI

用C或C++编写的代码相对于Java来说更难被反编译。但这种方法除非真的有必要,否则不提倡使用。

因为本地代码很难调试,如果执行异常会导致整个虚拟机异常关闭。同时.so会被加载到虚拟机的内存中,无论是否使用都占用内存空间。

另外,很多搞Java的人不太熟悉C或C++、如果你的公司有人熟悉还好。

d) 混淆

混淆是在不改变代码逻辑的情况下,增加无用代码,或者重命名类名、方法名和变量名,使反编译后的源代码难于看懂,提高被破解的难度。

本专题重点讲解在Android应用程序如何混淆代码,首先我们先来看一下混淆前后反编译的结果对比。

图1 原始代码

图2 混淆前反编译

图3 混淆后反编译

我们可以看到,类名、方法名和变量名等都会被改掉,方法的含义无法直接看出来,但如果是字符串常量还是会被反编译出来的,所以说关键的key不能放到apk中,它无处遁形。

下面我们来介绍如何使用混淆工具。Android2.3中提供了混淆的功能,跟我们这里介绍的使用的都是proguard混淆器。

我们介绍的这一个方法,除了混淆之外,还包括程序的签名,安装等功能。它是基于ant编译的,功能更强大。你也可以在整个编译过程插入其他你想要的功能,例如单元测试。

使用方法:

首先要在你的工程中增加一个配置文件,用来配置环境变量和签名文件,例如build.cfg,在这个文件中需要指定哪些类不需要被混淆。在Android中,所有在配置文件中会使用到类名的类,不应该被混淆。否则程序执行过程中会出现ClassNotFoundException。

再创建一个build.xml,用于指定ant编译的过程。最后执行build.xml,就完成了代码的混淆、打包、签名整个过程。你可以用反编译工具检测一下是否混淆成功。

图4 执行build.xml的方法

请参考工程示例来操作,配置文件中需要修改的地方都已标出,请搜索“这里要修改”关键字,所有查找到的地方都要检查一下,按照自己的环境配置修改。

以上几种方法结合使用,效果倍增。破解你程序的人会说,想不到狮吼功还有一招大喇叭……

如果你的公司真的需要这么保密,那么,首先要看你的公司是否有严密成熟的信息安全制度,否则一切都徒劳,因为家贼难防,堡垒最容易从内部攻破。

源代码已共享,地址:http://u.115.com/file/bhnchwu6

答疑在QQ群中。

附:混淆使用的是免费的proguard组件,官网:http://proguard.sourceforge.net/

隋雨辰

2011-05-15

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 一款常用的 Squid 日志分析工具
  3. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  4. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  5. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  6. Android运行时异常“Binary XML file line # : Error inflating
  7. Android学习【7】manifest文件讲解
  8. Android沙盒开发之系统libc库定制修改
  9. Android(安卓)Developers:存储选项

随机推荐

  1. Android下的OpenGl ES
  2. Android(安卓)Studio-build错误:app:merg
  3. Android应用程序中启动另一个应用程序
  4. android 模拟按钮点击
  5. Android之十二微信UI界面设计
  6. android 常用方法集合
  7. Android(安卓)Animation Frame动画
  8. Android(安卓)点击按钮,文字改变颜色
  9. 26、Android之Handler异步消息处理机制
  10. Android横竖屏幕切换生命周期详解