一、背景
1.1 Java语言的特点
Java是解释型语言(实事上是编译型与解释型混合),在生成软件产品时源代码被编译成有规范可循的二进制字节码.class文件进行打包,然后由JVM将.class解释给CPU执行,所以我们拿到Java的软件产品后,对照相应的编译规范,很容易将.class文件内容还原成源代码。
1.2 加密的必要性
1. 知识产权:
源码加密最主要的原因就是为了保护知识产权,不论是个人还是公司、单位,软件都是劳动的成果,而源码就是成果的核心,加密就是为了保护劳动成果不被窃取。
2. 系统安全:
软件交付部署后,尤其是web应用,如果被还原成源码,很容易发现潜在漏洞,被非法利用操作,对系统数据产生破坏,因此安全也是源码加密的重要因素。
3. 商业方面:
如果被还原成源码,很容易理清内部业务关系,从而加以分析获取商业秘密。
二、如何进行加密
2.1 加密的目标
加密的目的是增加和提高破解(反编译)的难度和时间成本,从而降低或减少源码泄露的几率。
加密的目标是生成人读不懂但是机器明白的东西。
2.2 加密的手段
套壳、混淆、代码隐藏、字节码转换、提前编译
三、各种加密技术分析对比
利用花指令和代码非等价变形等技术,将程序的代码,转换成一种功能上等价,但是难于阅读和理解的代码,可充分干扰静态分析(替换类名,变量名,方法名,参数名等) | |||||
不在维护了,加解密算法可以被截获,隐藏的数据区域有可能被恢复 |
不支持反射和动态代理的框架,破坏了Java跨平台的特性,需要针对不同的平台和环境编译 | ||||
四、总结
通过以上几个方面的对比,结合我们的实际需求,以及目前所拥有的技术能力,在能保证高度安全的情况下,选择一个使用成本低,易于系统维护的加密技术是比较合理的,所以建议使用字节码转换技术进行加密。