使用定制ClassLoader来对保护j2ee程序

类别:Java 点击:0 评论:0 推荐:

现在大部分的j2ee程序都没有一个好的保护办法,很传统的办法就是混淆编译,但是如果使用混淆边以后,可能导致jsp中的代码不能正常运行。

其实有个好的办法就是使用定制ClassLoader来load一些关键的类,使用定制的classload来装载类的话,就可以对关键的类加密后在解密后就可以了。

如果只这样的话可能还存在漏洞,就是定制ClassLoader没有加密,如果ClassLoader反编译后就可能得到你的类了,我们第一步所做的就成了徒劳。有没有好的办法解决这个问题呢?其实也有,就是修改java.exe,自己控制java.exe装载定制的classloader具体的办法可以参照如何有效的保护JAVA程序。

另外还有一个问题就是,在tomcat,weblogic,websphere等应用服务器中怎样能保证他们使用定制的classloader来load我加密的类呢?一般应用服务器是不提供这个外部classloader这个功能的。要解决这个问题就是使用factory设计模式,接口,实现类和工厂类,在工厂类中获取接口实例化类的时候不用直接new,而是首先调用实例化定制的classloader,接着调用定制classloader的load方法装载类。

程序代码段如下:

//MyClassLoader.java
package com.test.classload;


import java.util.jar.*;
import java.io.*;
public final class MyClassLoader extends ClassLoader {

  private static JarFile jar = null;
  public MyClassLoader() {
  }
  public Class findClass(String name) throws java.lang.ClassNotFoundException {
      Class clasz = null;
      clasz = findLoadedClass(name);
      if(clasz!=null){
        return clasz;
      }

      if(jar==null)

        try {
          String dir = System.getProperty("user.dir");
          String fileName = dir + File.separator +"test.jar";
          jar = new JarFile(fileName);
        }
        catch (IOException ex) {
          throw new ClassNotFoundException(name);
        }
        String className = name.replace('.','/');
        className = className + ".class";
        JarEntry entry = jar.getJarEntry(className);
        try {
          InputStream is = jar.getInputStream(entry);
          int len = is.available();
          byte[] cls = new byte[len];
          is.read(cls,0,len);
          clasz = defineClass(name,cls,0,len);
          if(clasz==null){
            clasz = findSystemClass(name);
          }
        }
        catch (IOException ex) {
           throw new ClassNotFoundException(name);
        }
        return clasz;
  }
}

//MyClassLoader.java
package com.test.classload;


import java.util.jar.*;
import java.io.*;
public final class MyClassLoader extends ClassLoader {

  private static JarFile jar = null;
  public MyClassLoader() {
  }
  public Class findClass(String name) throws java.lang.ClassNotFoundException {
      Class clasz = null;
      clasz = findLoadedClass(name);
      if(clasz!=null){
        return clasz;
      }

      if(jar==null)

        try {
          String dir = System.getProperty("user.dir");
          String fileName = dir + File.separator +"test.jar";
          jar = new JarFile(fileName);
        }
        catch (IOException ex) {
          throw new ClassNotFoundException(name);
        }
        String className = name.replace('.','/');
        className = className + ".class";
        JarEntry entry = jar.getJarEntry(className);
        try {
          InputStream is = jar.getInputStream(entry);
          int len = is.available();
          byte[] cls = new byte[len];
          is.read(cls,0,len);
          clasz = defineClass(name,cls,0,len);
          if(clasz==null){
            clasz = findSystemClass(name);
          }
        }
        catch (IOException ex) {
           throw new ClassNotFoundException(name);
        }
        return clasz;
  }
}

//TestDAO.java
package com.test.classload;

public interface TestDAO {

  public String getName();
}

//TestDAOImp.java
package com.test.classload;

public class TestDAOImp implements TestDAO {

  public TestDAOImp() {
  }
  public String getName() {

    return "方见华";
  }
}

 

本文地址:http://com.8s8s.com/it/it16037.htm