`

Tomcat下代码加密

    博客分类:
  • J2EE
阅读更多
这篇文章目的:第一、让tomcat更加安全,代码更加安全。
第二、更进一步学习tomcat,学习加载机制。


代码混淆方法之二(tomcat下面代码加密)
       上面说到代码混淆方法之混淆器使用,主要针对proguard进行了说明。其实,只要我们的类被其他地方的类调用到的话,那么代码混淆器就似乎没有办法了,因为代码混淆如果把代码的签名一起改了的话,其他地方是肯定调用不到,并会出错。而且,针对代码调用,有几点是我们肯定不能避免的:一是jsp页面,如果在jsp页面调用了某个类,那么如果类被混淆了的话,jsp页面肯定会出错;二是xml配置文件,比如在hibernate开发中,对于hbm.xml文件,就没办法了。不过,很庆幸的是,proguard的功能很强,可以通过配置,只针对私有方法、私有变量做混淆。但是,这种混淆效果肯定是不如所愿。下面将说明代码混淆方法之二(tomcat下面代码加密)

       应用服务器加密的方法不外就是通过修改该应用服务器的类转载器,来载入我们的类。首先我们通过一定算法,将我们的class文件加密,并部署到应用服务器。然后修改修改该应用服务器的类转载器,通过解密算法将class文件反编译并加载。从而达到class文件的加密。下面主要针对tomcat下面的加密、解密说明。

     首先得研究一下tomcat的类装载机制:tomcat的类装载机制主要分为下面几种:

   1、Bootstrap: 由虚拟机提供
   2、System:类路径等相关
   3、Common:tomcat下面的公共包
   4、Catalina:tomcat自己的包,比如server目录下面
   5、Shared:各个war包的共享包
   6、Webapp:各个war包自己的相关类包

   由于一般的典型情况是,我们是要加密自己的应用程序,那么,我们就要覆盖上面所说的Webapp类装载器。tomcat的Webapp类装载器位于${tomcat.home}\server\lib\catalina.jar下面的类org.apache.catalina.loader.WebappClassLoader。我们从tomcat的网站下面下载tomcat的源代码,WebappClassLoader的源代码位于目录\jakarta-tomcat-catalina\catalina\src\share\org\apache\catalina\loader下面,打开源代码,可以看到里面的调用机制是这样的:
     该类里面提供了很多诸如addRepository、addJar之类的方法,这是tomcat给类路径添加相应的目录和包,比如在启动时,tomcat会将我们的应用程序下面的WEB-INF/lib/*.jar和WEB-INF/classes/**.class添加到资源路径下面。
   
    首先,在加载类的时候,会调用loadClass方法。我们先定位到下面这个方法   
     public Class loadClass(String name, boolean resolve)
        throws ClassNotFoundException

     仔细观察该方法,可以发现,tomcat提供了很多缓存机制,首先分别从各个级别的缓存加载类,如果加载到类,就直接返回,否则会调用下面的方法: clazz = findClass(name);

     继续定位到方法 public Class findClass(String name) throws ClassNotFoundException
     该方法里面有一句调用 clazz = findClassInternal(name); 这个很关键,也就是我们最需要关心的一个方法了。再仔细阅读一下,就能发现,tomcat从本地的资源库里面找,并先查找资源缓存,如果找到的话,直接返回缓存类。若找不到,就会读取类文件的byte[]数组,并最后调用defineClass方法。defineClass文件是类装载的最后一个类定义方法。下面就是findClassInternal方法的代码小段

           if (entry.loadedClass == null) {
            synchronized (this) {
                if (entry.loadedClass == null) {
                
                  clazz = defineClass(name, entry.binaryContent, 0,
                                        entry.binaryContent.length,
                                        codeSource);              
                 }
                    entry.loadedClass = clazz;
                    entry.binaryContent = null;
                    entry.source = null;
                    entry.codeBase = null;
                    entry.manifest = null;
                    entry.certificates = null;
                } else {
                    clazz = entry.loadedClass;
                }
            }
        } else {
            clazz = entry.loadedClass;
        }

      entry是一个存放类属性的bean,其中类的数组流存放在binaryContent,那么我们的加密解密就从这里入手。为了方便起见,我们用base64算法加密,加密方法很简单。通过调用base64加密方法,把原有的class文件加密;推荐的base64加密方法是commons包的codec工程。可以从apache上面下载。把加密后的class文件替换tomcat下面的部署类文件。 那么在类装载时就可以解密,并加载了。例如,为了测试,个人只对OrganizationServiceImp.class进行加密,那么通过修改以上的装载方法,就可以实现解密,修改后的代码为如下,其中黑体为修改的

        if (entry.loadedClass == null) {
            synchronized (this) {
                if (entry.loadedClass == null) {
                
                 if(name.indexOf("OrganizationServiceImp") >=0)
                 {
                    byte[] base64Array = entry.binaryContent;
                    byte[] orginByteArray = Base64.decodeBase64(base64Array);
                    clazz = defineClass(name, orginByteArray, 0,
                      orginByteArray.length,
                               codeSource);
                 }
                 else
                 {
                  clazz = defineClass(name, entry.binaryContent, 0,
                                        entry.binaryContent.length,
                                        codeSource);
                                       
                 }
                    entry.loadedClass = clazz;
                    entry.binaryContent = null;
                    entry.source = null;
                    entry.codeBase = null;
                    entry.manifest = null;
                    entry.certificates = null;
                } else {
                    clazz = entry.loadedClass;
                }
            }
        } else {
            clazz = entry.loadedClass;
        }
     
      运行服务器,一切正常,说明解密、加密成功,到此完成tomcat服务器下面的解密、加密。可以看出,tomcat下面的类装载机制其实挺简单,不像其他服务器,比如weblogic、websphere服务器那么复杂。若能在这些服务器下面实现类似的效果,将是一个多么爽的事。个人在近几天将对weblogic服务器下面的部署应用进行类似的研究

注:这个并非完美,在一定程度上可以破解
分享到:
评论

相关推荐

    class加密保护支持tomcat下web应用加密

    修改tomcat的bin目录下catalina.bat set JAVA_OPTS=-agentlib:c:\jvm\deClass linux下 拷贝libdeclass.so到/lib下 java -agentlib:declass Hello tomcat: 修改catalina.sh JAVA_OPTS =-agentlib:declass

    基于Tomcat的代码class加密技术 可实现加密的Tomcat

    我们的生产环境用的发布都是通过IDE编译出来的,安全性很低,只要有人拿到class任意找一款工具就可以反编译获取源码,这样对代码很不安全,我开发了一套系统,在IDE编译后的class的基础上再次处理加密,在Tomcat运行...

    Tomcat 配置文件数据库密码加密

    Tomcat 配置文件数据库密码加密,增加factory属性和修改context....代码是jdk1.8版本,包含简单的加密类和http请求,如果使用简单的加密,不需要引用额外的lib包,只需要tomcat-dbcp.jar即可。使用http就需要多个har包

    Spring-asm类加载修改/Tomcat Spring web项目源代码加密

    为了防止产品代码泄漏或授权等被破解,想到对源码加密,说是对源码加密,实际是需要对class文件进行加密。如果对class文件加密了,那类加载器如何能解析呢?本文讲解的就是SpringWeb项目加密后如何能在tomcat下面...

    基于jvmti 的Java 代码加密

    基于jvmti基础所构建的Java代码加密小工具,防止Java 代码被反编译,造成源码泄露,支持tomcat 和spring 等集成使用

    jspbook.rar_java 验证码_jsp JavaBean_jsp tomcat_验证码 加密

    该留言本采用JSP+JavaBean+Access开发,直接放到Tomcat下就能运行,不用配置数据源。 含有UBB代码和UBB头像,采用正则表达式制作。 管理登陆加入验证码,数据库管理密码采用MD5加密。

    基于jvmtiJava代码加密和解密源码

    jvmti加密源码,包含基于jvmti,利用c++ 编译的动态库,用一定的算法将Java里.class加密的源码代码,以及在tomcat 上完成解密并正常启动的源码,支持spring框架 和springboot,防止反编译

    java web 项目打包、加密工具

    JInstall—专业的java web 项目打包、加密工具 软件说明: 通常情况下,java项目很容易被反编译、破解。即使对class文件进行了... 加密:打包过程中对所有需要保护的类文件进行高强度加密,保护你的代码不被反编译。

    tomcat禁用RC4的方法

    复制代码 maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" ciphers="TLS_ECDHE_RSA_WITAES_128_CBC_...

    Java类文件加密专家

    传统的Java程序加密的方式多为代码混迹方式,但是无论多么复杂的混迹方式,在使用Java代码反编译程序后还是可以看到代码的逻辑结构,这样并没有彻底的保护好您的代码。 Java 类文件加密专家通过分析Class文件的结构...

    Java类加密程序

    简要介绍 JAVA CLASS文件加密工具是一款专门为保护您的JAVA源代码而设计的软件。传统的JAVA代码保护方式通常是扰乱生成的CLASS文件,从而降低反编译生成的源代码的可读性;有的保护工具甚至能生成部分废代码...

    xmljava系统源码-classfinal:Java类加密工具

    运行加密项目时,无需求修改tomcat,spring等源代码。 支持普通jar包、springboot jar包以及普通java web项目编译的war包。 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。 支持...

    Java类加密2.0版本,无限制

    JAVA CLASS文件加密工具是一款专门为保护您的JAVA源代码而设计的软件。传统的JAVA代码保护方式通常是扰乱生成的CLASS文件,从而降低反编译生成的源代码的可读性;有的保护工具甚至能生成部分废代码(垃圾代码),...

    JavaClass二进制文件加密专家

    系统介绍 JavaClass文件加密专家... <br> 应用环境 JavaClass文件加密专家只能用在JDK1.5及更新版本的JDK中,您在Windows平台下加密后的Class文件不必再修改就可以应 用于Linux、Unix等平台中。

    java class加密保护工具

    很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式, 但这样会带来很多麻烦,而且也不能真正保护class文件, 本工具是对class文件进行加密,采用jni的方式解密运行, 加密算法达到256位...

    java类加密工具v2.1

    很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式, 但这样会带来很多麻烦,而且也不能真正保护class文件, 本工具是对class文件进行加密,采用jni的方式解密运行, 加密算法达到256位...

    Java类加密工具v2.2(免注册)

    很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式, 但这样会带来很多麻烦,而且也不能真正保护class文件, 本工具是对class文件进行加密,采用jni的方式解密运行, 加密算法达到256...

    tomcat部署web项目.docx

    Tomcat还支持SSL协议,可以实现安全的加密连接。 Tomcat是一个轻量级的Web服务器,占用资源较少,启动速度较快。它可以与其他Web服务器(如Apache)结合使用,通过连接器(connector)实现负载均衡和代理服务。 ...

    ClassFinal字节码加密工具-其他

    运行加密项目时,无需求修改tomcat,spring等源代码。支持普通jar包、springboot jar包以及普通java web项目编译的war包。支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。支持maven...

    java class加密保护(完全免费) v2.1

    很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式, 但这样会带来很多麻烦,而且也不能真正保护class文件, 本工具是对class文件进行加密,采用jni的方式解密运行, 加密算法达到256位...

Global site tag (gtag.js) - Google Analytics