zoukankan      html  css  js  c++  java
  • javaee加密部署,tomcat使用自己的classloader解密【正解】

    【起因】

    公司需要对一个web项目进行加密之后出售,

    大家都知道的,class很好反编译,

    所以需要对class文件先进行加密,

    然后使用自己的classloader进行解密并加载。


    【步骤】

    大概分两步:

    1.对class文件进行加密

    2.写解密class文件并加载的classloader

    3.将这个classloader加入到tomcat中,也就是使tomcat可以调用到这个classloader


    【加密】

    1.思路

    字节流读取class文件,进行简单的移位

    2.实现

    做了一个小程序,实现了对某文件夹下所有class文件字节流读取,并+2位的加密方式

    3.说明

    swing是使用myeclipse的插件做的,可能比较乱

    4.代码&下载

    加密程序的源代码和程序打包成jar文件上传到了这里,双击可以使用。


    【classloader】

    1.代码:

    package com.uikoo9.loader;
    
    import java.io.ByteArrayOutputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    import org.apache.catalina.loader.WebappClassLoader;
    
    /**
     * 自定义的classloader
     * 可以解密文件并加载
     * @author uikoo9
     */
    public class UClassLoader extends WebappClassLoader{
    	
    	/**
    	 * 默认构造器
    	 */
    	public UClassLoader() {
    		super();
    	}
    
    	/**
    	 * 默认构造器
    	 * @param parent
    	 */
    	public UClassLoader(ClassLoader parent) {
    		super(parent);
    	}
    
    	/* (non-Javadoc)
    	 * @see org.apache.catalina.loader.WebappClassLoader#findClass(java.lang.String)
    	 */
    	public Class<?> findClass(String name) throws ClassNotFoundException {
    		if(name.contains("uikoo9")){
    			return findClassEncrypt(name);
    		}else{
    			return super.findClass(name);
    		}
    	}
    	
    	/**
    	 * 查找class
    	 * @param name
    	 * @return
    	 * @throws ClassNotFoundException
    	 */
    	private Class<?> findClassEncrypt(String name) throws ClassNotFoundException{
    		byte[] classBytes = null;
    		try {
    			System.out.println("++++++" + name);
    			classBytes = loadClassBytesEncrypt(name);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    		Class<?> cl = defineClass(name, classBytes, 0, classBytes.length);
    		if (cl == null)
    			throw new ClassNotFoundException(name);
    		return cl;
    	}
    	
    	/**
    	 * 加载加密后的class字节流
    	 * @param name
    	 * @return
    	 * @throws IOException
    	 */
    	private byte[] loadClassBytesEncrypt(String name) throws IOException {
    		String basepath = "Z:/program/workspaces/_work_03_bzb/WebRoot/WEB-INF/classes/";// 项目物理地址
    		String cname = basepath + name.replace('.', '/') + ".uikoo9";
    		System.out.println(cname);
    		FileInputStream in = new FileInputStream(cname);
    		try {
    			ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    			int ch;
    			while ((ch = in.read()) != -1) {
    				buffer.write((byte)(ch - 2));
    			}
    			in.close();
    			return buffer.toByteArray();
    		} finally {
    			in.close();
    		}
    	}
    }
    


    【加入到tomcat】

    1.context.xml

    找到tomcat下contex.xml,在context之间加入以下代码:

                <Loader loaderClass="com.uikoo9.loader.UClassLoader" delegate="true"></Loader>

    其中loaderClass就是自己写loader,delegate=“true”的意思是只解密非系统的class和jar

    2.添加loader

    将自己写的loader的class文件放到tomcatlib下


    【开始】

    1.使用加密程序对classes下所有文件加密,加密之后所有的class文件后缀变为uikoo9,可以自己修改源代码

    2.将原classes文件夹删除,将加密后的classes文件夹复制进去

    3.修改context.xml

    4.tomcatlib下添加loader.class

    5.启动tomcat


    经过实验是没问题的,如有疑问请留言。

  • 相关阅读:
    PHP保留小数的相关方法
    ASP.NET Core MVC 之过滤器(Filter)
    ASP.NET Core MVC 之控制器(Controller)
    ASP.NET Core MVC 之视图组件(View Component)
    ASP.NET Core MVC 之局部视图(Partial Views)
    标签助手(TagHelper)
    ASP.NET Core MVC 之布局(Layout)
    ASP.NET Core MVC 之视图(Views)
    ASP.NET Core MVC 之模型(Model)
    九卷读书:淘宝从小到大的发展 -重读《淘宝技术这十年》
  • 原文地址:https://www.cnblogs.com/riasky/p/3471293.html
Copyright © 2011-2022 走看看