>>分享Android开发相关的技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19285 个阅读者 刷新本主题
 * 贴子主题:  如何提高Android代码的安全性 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2020-05-15 09:16:05     消息  查看  搜索  好友  邮件  复制  引用

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

             点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                                                 图1 原始代码

              点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                                                图2 混淆前反编译

         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                                                图3 混淆后反编译

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

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

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

               使用方法:

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

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

               点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                    图4 执行build.xml的方法

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

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

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

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

             答疑在QQ群中。

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


----------------------------
原文链接:https://blog.51cto.com/yuchen/586940

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-05-31 14:43:37 重新编辑]
  Java面向对象编程-->Java常用类(下)
  JavaWeb开发-->JSP中使用JavaBean(Ⅰ)
  JSP与Hibernate开发-->映射一对多关联关系
  Java网络编程-->通过JDBC API访问数据库
  精通Spring-->Vue指令
  Vue3开发-->Vue Router路由管理器
  Android Broadcast receiver 编程
  Android Gallery实现循环显示图像
  Android自动化测试之Robotium学习
  android异步更新UI
  Android UI学习 - Menu
  Android那些事儿之LBS定位
  众多Android 开源项目推荐
  Android 解码播放GIF图像
  Android开发随想:iPhone和Android之间的对话
  Android--Widget开发
  浅析Android的通知系统
  Html5调用手机摄像头并实现人脸识别
  Android 碎片(Fragment)
  RecyclerView顶部阴影透明度渐变效果
  Android 启动页倒计时自定义view实现
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。