Java加密部署,使用自定义的classloader解密的方法实例

一、前言

1. 简介

  使用jfinalQ-encrypt开源软件。对项目的class文件加密,防止反编译,可自定义加密解密算法,支持tomcat部署。

2.jfinalQ-encrypt 项目结构

3. 流程

2.1 首先将class文件进行字节流加密;
2.2 然后自定义tomcat的ClassLoader;
2.3 最后通过自定义的ClassLoader解密并加载class。

二、加密

  本节以Test项目为例,对其class文件进行加密。并用自定义的classloader进行解密。

1. Test项目目录结构

1.1 web.xml 配置


<web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

  <servlet>
    <servlet-name>HelloServletservlet-name>
    <servlet-class>com.demo.HelloServletservlet-class>
  servlet>

  <servlet-mapping>
    <servlet-name>HelloServletservlet-name>
    <url-pattern>/HelloServleturl-pattern>
  servlet-mapping>

web-app>

1.2 HelloServlet代码

package com.demo;

import java.io.IOException;

/**
 * 请求地址 :http://localhost:8080/Test/HelloServlet
 */
public class HelloServlet extends HttpServlet { 

    // handle post request
    private static final long serialVersionUID = 1L;

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getParameter("userName");

    response.setContentType("text/html");
    response.setCharacterEncoding("UTF-8");

    PrintWriter out = response.getWriter();
    out.println("欢迎你: "+new String(name.getBytes("ISO-8859-1"), "UTF-8")+ "!");
    }

    // destroy
    public void destroy() {
    }
}

1.3 前端页面代码

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"
    language="java"%>

<html>
<head>
<title>HelloServlettitle>
head>
<body>
    <form action="HelloServlet" name="form" method="post">
        姓名:<input type="text" name="userName"><br> <input
            type="submit" value="登录">
    form>
body>
html>

此时部署成功后经测试,tomcat下class文件可以轻松反编译,JSP页面可正常访问servlet文件。接下来对class文件进行加密。

2. 加密解密算法,可修改

3. 运行QEncryptFrame.java文件

  • 选择需要加密的文件


- 加密成功后显示

4. 把生成的加密后的class文件拷贝到源class文件的位置。

覆盖完成后,不要做修改代码,clean等操作,否则加密后的class会被再次覆盖。

5. 测试

  • 此时再对class文件进行反编译,则如下报错

  • 并且JSP文件不可正常请求servlet


- 点击登录后返回

三、解密

1. 配置 loader.properties 文件

此配置文件指定了自定义的ClassLoader需要进行解析的classs文件范围。

encrypted_package=com.demo
encrypted_class_path=D\:/apache-tomcat-7.0.70/webapps/Test/WEB-INF/classes/
  • encrypted_package 需要进行解密的包,多个包名用逗号分隔;
  • encrypted_class_path tomcat中项目的classess文件夹路径。

2. 打包自定义classloader文件

将jfinalQ-encrypt中的loader包和QClassUtil打为一个jar,并命名为++classloaderQ.jar++,如下图所示:

3. 更改tomcat的默认loader,改为自定义classloader

  • 修改tomcat/conf/context.xml文件,添加如下代码:
<Loader loaderClass="com.uikoo9.loader.QClassLoader" delegate="true">Loader>

4. 替换jar包

把classloaderQ.jar放到Tomcat的lib(D:\apache-tomcat-7.0.70\lib)文件夹下面。

5. 测试

  • 对class文件进行反编译,报错
  • JSP文件可正常请求servlet.

  • 点击登录后返回页面

  • 测试成功

四、源码

  • 源码下载

五、后记

由于时间原因,jfinalQ-encrypt源代码没能细读,只能做到初步应用,此文有待逐步后续完善。

你可能感兴趣的:(●,网络安全)