修改Spring源码对Web项目进行加密

Posted 架构学习之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改Spring源码对Web项目进行加密相关的知识,希望对你有一定的参考价值。

对Web项目进行加密,防止用户对class文件进行反编译,可选的方案有一下几种:

  1. 使用收费的加密软件;

  2. 使用开源的加密工具,但一般只能加密非Srping框架的Web项目;

  3. 自定义加解密处理。


本文记录自定义加解密处理,对Spring框架项目进行加密处理的方法。

对Spring项目进行加密处理,难点在于Spring有自己的类加载器,所以除了要定制Tomcat的类加载器外,还需要修改Spring本身的类加载处理。本文基于Spring4.3.7整理。


加密处理流程如下:

  1. 自定义密钥生成器,生成加密密钥,保存到Web工程相关的目录下。

  2. 自定义类文件加密工具,对指定的目录下的class文件进行加密,并删除原始文件。加密后的class文件修改后缀名,类加载器可以通过后缀名判断文件是否加密,这样能够同时加载加密的和为加密的文件。

  3. 自定义Tomcat类加载器,替换默认的类加载器,判断要加载的类是否是加密文件,如果是加密文件,对文件进行解密,将解密后的数据返回给Tomcat。

  4. 修改spring-core,对以下的类的处理进行修改,使之能够加载加密的文件:

    ClassPathResource

    SimpleMetadataReader

    SimpleMetadataReaderFactory

    LocalVariableTableParameterNameDiscoverer

  5. 修改srping-context,对以下类的处理进行修改,使之能够加载加密的文件:

    ClassPathScanningCandidateComponentProvider

  6. 使用以上修改的两个Spring的jar包替换Spring工程lib目录下的jar包。

  7. 启动tomcat,验证加密的class是否正常加载。


如何修改Spring源码

有两种方式修改Spring源码:

  1. 从github下载Spring全部源码,对其进行编译,然后修改

    这种方法的缺点是spring的整体的代码很大,并且是基于gradle的,下载后需要进行转换才能在exlipse中正常使用。转换的过程中因为gradle版本等问题经常出错,调试错误非常耗时。

  2. 具有针对性的修改spring的jar包。


本文使用第二种方式,对Spring源码进行修改,修改步骤如下:

  1. 在自己用户目录下的.m2目录下找到需要修改的jar包,通过maven下载jar包对应的源代码。这样,在对应的目录下就能找到三个文件:

    spring-XXXX.jar

    spring-XXXX-source.jar

    spring-XXXX.pom

    这三个文件分别是编译好的jar包、对应的源代码和pom配置文件。

  2. 打开idea,新建一个maven项目。

  3. 解压源代码jar文件,将org.springframework及以下子目录的源代码拷贝到新建工程的src/main/java目录下

  4. 将pom文件拷贝到工程根目录,并重命名为pom.xml

  5. 使用rar对原始的jar包进行解压,将META-INF目录拷贝到新建工程的src/main/resources目录下。

  6. 执行maven的compile操作,确认是否编译成功。

  7. 使用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包的引用即可。


相关的配置和命令

  1. 配置Tomcat的类加载器

    将自定义的类加载器达成jar包,放到tomcat的lib目录下

    修改context.xml,添加以下配置:

    <Loader loadClass="com.xxx.EncryptClassLoader" delegate="false"></Loader>

  2. 将指定的目录达成jar包

    jar cvf xxx.jar  {顶层目录路径}

  3. 将jar包导入本地marven库

    mvn install:install-file -DgroupId=xxx -DartifactId=xxx -Dversion=XXX -Dfile=xxx.jar -Dpackaging=jar

以上是关于修改Spring源码对Web项目进行加密的主要内容,如果未能解决你的问题,请参考以下文章

spring学习七 spring和dynamic project进行整合

008-shiro与spring web项目整合认证授权session管理

spring学习 ———— 整合web项目(SSH)

对spring web启动时IOC源码研究

对spring web启动时IOC源码研究

基于Javaweb高校毕业生实习管理系统 .rar(论文+项目源码)