最近针对代码安全保护需求进行技术调研,因为java文件编译成为class之后,可以通过反编译工具jd查看代码的逻辑,以及执行过程。为了防止class文件被反编译,调研了多种处理方案,其中最常见的就是代码混淆和class文件加密。目前proguard做的还不错,相关文章也比较多,但是复杂度还是有的,可以自行了解。接下要说的就是class文件加密技术,可以采用对称加密和非对称加密,算法也有很多种,对称加密一般采用AES,目前采用AES。
那么对class文件加密后,在什么地方解密呢?一般是在内存解密,即在classloader加载类的时候解密。此处需要了解classloader加载类的机制和过程。之前项目打成的war包,所以专门定制了一个tomcat,以此保护代码,但是只要找到类加载的地方,也是可以解密的。引申一下,如果想要保护的更加安全,就需要修改native方法,即定制jvm,修改c代码,这样破解的难度就非常大了。另外的方式,也可以采用加密狗,通过加密狗的方式进行保护。
目前对springboot的包进行加密,采用xjar,在GitHub上开源,也是比较活跃的,通过源码分析,其实也就是自己实现了一个classloader,然后classloader对加载的class进行解密。对于代码保护还是比较有用的,可以自行了解一下。
我在分析xjar的源码过程中,顺带就分析了一下spring-boot-maven-plugin,这个插件是对springboot打成可运行的jar包,通过jar包分析,我们可以看到多了spring-boot-loader的文件,如下图:
那么loader是从何而来,有没有在maven中引入loader的工程。通过springboot的文档了解,该loader是通过spring-boot-maven-plugin插件打包进来的,那么接下来就分析一下这个插件。
首先在springboot工程的pom文件中额外引入如下的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-loader</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-loader-tools</artifactId> <version>2.1.6.RELEASE</version> &l