修改Spring源码对Web项目进行加密
Posted 架构学习之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改Spring源码对Web项目进行加密相关的知识,希望对你有一定的参考价值。
对Web项目进行加密,防止用户对class文件进行反编译,可选的方案有一下几种:
使用收费的加密软件;
使用开源的加密工具,但一般只能加密非Srping框架的Web项目;
自定义加解密处理。
本文记录自定义加解密处理,对Spring框架项目进行加密处理的方法。
对Spring项目进行加密处理,难点在于Spring有自己的类加载器,所以除了要定制Tomcat的类加载器外,还需要修改Spring本身的类加载处理。本文基于Spring4.3.7整理。
加密处理流程如下:
自定义密钥生成器,生成加密密钥,保存到Web工程相关的目录下。
自定义类文件加密工具,对指定的目录下的class文件进行加密,并删除原始文件。加密后的class文件修改后缀名,类加载器可以通过后缀名判断文件是否加密,这样能够同时加载加密的和为加密的文件。
自定义Tomcat类加载器,替换默认的类加载器,判断要加载的类是否是加密文件,如果是加密文件,对文件进行解密,将解密后的数据返回给Tomcat。
修改spring-core,对以下的类的处理进行修改,使之能够加载加密的文件:
ClassPathResource
SimpleMetadataReader
SimpleMetadataReaderFactory
LocalVariableTableParameterNameDiscoverer
修改srping-context,对以下类的处理进行修改,使之能够加载加密的文件:
ClassPathScanningCandidateComponentProvider
使用以上修改的两个Spring的jar包替换Spring工程lib目录下的jar包。
启动tomcat,验证加密的class是否正常加载。
如何修改Spring源码
有两种方式修改Spring源码:
从github下载Spring全部源码,对其进行编译,然后修改
这种方法的缺点是spring的整体的代码很大,并且是基于gradle的,下载后需要进行转换才能在exlipse中正常使用。转换的过程中因为gradle版本等问题经常出错,调试错误非常耗时。
具有针对性的修改spring的jar包。
本文使用第二种方式,对Spring源码进行修改,修改步骤如下:
在自己用户目录下的.m2目录下找到需要修改的jar包,通过maven下载jar包对应的源代码。这样,在对应的目录下就能找到三个文件:
spring-XXXX.jar
spring-XXXX-source.jar
spring-XXXX.pom
这三个文件分别是编译好的jar包、对应的源代码和pom配置文件。
打开idea,新建一个maven项目。
解压源代码jar文件,将org.springframework及以下子目录的源代码拷贝到新建工程的src/main/java目录下
将pom文件拷贝到工程根目录,并重命名为pom.xml
使用rar对原始的jar包进行解压,将META-INF目录拷贝到新建工程的src/main/resources目录下。
执行maven的compile操作,确认是否编译成功。
使用package命令进行打包,在target目录中获取修改后的jar包。有时候自己打包的jar替换原始的jar后可能不能正常使用,可以尝试使用rar打开原始的jar包,将修改的类的class文件拖入rar中,只替换修改的class文件。
缺少jar包的处理方法
在修改spring-core时,将源代码按照上述方法导入idea,会报找不到一些类的引用,经查是缺少cglib-repack和objenesis-repack两个jar包,这两个jar包很难找到marven的对应配置信息,无法自动下载,即使找到了,也不确定和当前的spring的版本相匹配。
解决办法是解压缩原始的spring-core的jar文件,找到cglib和objenesis两个文件夹,然后将两个文件夹打成jar包,并添加到marve仓库,然后在新建的spring-core工程的pom文件中添加这两个jar包的引用即可。
相关的配置和命令
配置Tomcat的类加载器
将自定义的类加载器达成jar包,放到tomcat的lib目录下
修改context.xml,添加以下配置:
<Loader loadClass="com.xxx.EncryptClassLoader" delegate="false"></Loader>
将指定的目录达成jar包
jar cvf xxx.jar {顶层目录路径}
将jar包导入本地marven库
mvn install:install-file -DgroupId=xxx -DartifactId=xxx -Dversion=XXX -Dfile=xxx.jar -Dpackaging=jar
以上是关于修改Spring源码对Web项目进行加密的主要内容,如果未能解决你的问题,请参考以下文章
spring学习七 spring和dynamic project进行整合