标签: Android 用户体验 移动开发 休闲 安全性 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处、作者信息和本声明。否则将追究法律责任。 http://yuchen.blog.51cto.com/2739238/586940

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应用程序如何混淆代码,首先我们先来看一下混淆前后反编译的结果对比。

Android 中提高代码安全性-混淆代码_第1张图片

图1 原始代码

Android 中提高代码安全性-混淆代码_第2张图片

图2 混淆前反编译

Android 中提高代码安全性-混淆代码_第3张图片

图3 混淆后反编译

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

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

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

使用方法:

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

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

Android 中提高代码安全性-混淆代码_第4张图片

图4 执行build.xml的方法

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

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

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

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

答疑在QQ群中。

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

隋雨辰

本文出自 “雨辰专栏” 博客,请务必保留此出处http://yuchen.blog.51cto.com/2739238/586940

更多相关文章

  1. 优化你的代码结构 --- MVP
  2. Android 图片异步加载的体会,SoftReference已经不再适用
  3. Android之动画(Java代码实现)1
  4. 【第一行代码】Android日志工具
  5. Android加载图片时OOM异常解决办法——Bitmap Options
  6. Android 本地代码中的LIKELY和UNLIKELY宏
  7. Android高效加载大图、多图解决方案,有效避免程序内存溢出现象
  8. (4.1.12)Android高效加载大图、多图解决方案,有效避免程序OOM
  9. Cocos2dx android 部分代码的理解

随机推荐

  1. Android 获取系统时间的三种方式
  2. Android 自定义View清除画布Canvas
  3. Android 判断屏幕滑动
  4. Android拖动控件
  5. Android之dialog实现底部出现对话框
  6. Android传感器学习总结
  7. android之线程访问网络并解析数据
  8. Android中判断网络连接是否可用的方法总
  9. Android获取系统储存以及内存信息的方法(
  10. android实现手机传感器调用