项目需要向外出售,涉及到版权问题需要进行代码加密。两周时间最终实现了对核心的一个package内的代码进行加密。还未实现对带有spring注解的类进行加密,但是以现在的技术积淀应该没有什么大的问题就可以将加密移植到springBoot源码之中,这个如果有的话后期再更新吧。
java加密很难,是因为源码编译后的字节码保留的源码信息是在太多导致了很容易被反编译。但是如果不是这样的话java也实现不了跨平台。所以加密的核心或者本质就是避免在程序装载到虚拟机之前保持字节码的不可见。加密思路当然就是将字节码使用AES等算法加密之后,解密并装载类的部分放到运行的虚拟机之中动态执行。并且解密这一部分用C/C++进行编写,在java中使用JNI技术调用。这样就成功将java的反编译难度提升到了反编译C的难度了。
知识一:ClassLoader的原理,这个自行查资料学习,但是需要注意的是。如果要加密的类比较复杂,比如一个类A中含有普通内部类、抽象内部类、讲台内部类、匿名内部类、内部接口。这就是加载难点所在。java编译之后的类A其实会生成多个.class文件,如果要使用自己的ClassLoader进行加载的话,必须控制好加载顺序。
ClassLoader的字节码加载顺序如下:
1、接口(普通接口或者内部接口)以及抽象类(普通抽象类或者内部抽象类)
2、静态内部类
3、其他类(普通类,匿名内部类,普通内部类,枚举)
具体如何实现自己想办法吧,我是写了段代码去使用正则表达式,通过遍历对比源码和字节码文件名进行了字节码文件的筛选,并排好顺序。
知识二