这篇文章目的:第一、让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服务器下面的部署应用进行类似的研究
注:这个并非完美,在一定程度上可以破解
分享到:
相关推荐
在Tomcat环境下,连接池通常使用Apache Commons DBCP(Database Connection Pool)来管理数据库连接。默认情况下,DBCP会直接读取配置文件中的用户名和密码,这意味着这些信息是以明文形式存在的。一旦服务器被非法...
Tomcat 配置文件数据库密码加密,增加factory属性和修改context....代码是jdk1.8版本,包含简单的加密类和http请求,如果使用简单的加密,不需要引用额外的lib包,只需要tomcat-dbcp.jar即可。使用http就需要多个har包
修改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
我们的生产环境用的发布都是通过IDE编译出来的,安全性很低,只要有人拿到class任意找一款工具就可以反编译获取源码,这样对代码很不安全,我开发了一套系统,在IDE编译后的class的基础上再次处理加密,在Tomcat运行...
本文将深入探讨基于jvmti(Java Virtual Machine Tool Interface)技术实现的Java代码加密方法,以及如何在Tomcat和Spring等环境中集成使用。 首先,我们要理解jvmti的概念。jvmti是Java虚拟机工具接口,它为开发者...
Tomcat支持多种安全策略,如SSL/TLS加密,Basic、Digest和Form认证,以及角色和权限的管理。通过`context.xml`和`server.xml`配置文件进行安全设置。 7. **部署与热部署** Tomcat支持自动部署和热部署,只需将Web...
Tomcat提供了多种安全机制,如SSL/TLS加密,角色基础的访问控制(RBAC),以及基于Jaas的身份验证和授权。这些可以通过`conf/server.xml`和`conf/tomcat-users.xml`等配置文件进行设置。 8. **性能优化**: ...
为了防止产品代码泄漏或授权等被破解,想到对源码加密,说是对源码加密,实际是需要对class文件进行加密。如果对class文件加密了,那类加载器如何能解析呢?本文讲解的就是SpringWeb项目加密后如何能在tomcat下面...
《如何工作:Tomcat代码详解》是一本深入探讨Apache Tomcat服务器内部机制的书籍,它提供了丰富的Java类示例,帮助读者理解Tomcat的工作原理。在这个压缩包中,"src"目录包含了书中所有示例代码的源文件。下面,我们...
标签中的“源码”可能暗示了深入理解Tomcat和LDAP的源代码可以帮助更好地定制和调试连接。而“工具”可能是指使用像`keytool`这样的工具来管理和操作证书。 文件列表中的“Security”可能是一个文件夹名,其中可能...
jvmti加密源码,包含基于jvmti,利用c++ 编译的动态库,用一定的算法将Java里.class加密的源码代码,以及在tomcat 上完成解密并正常启动的源码,支持spring框架 和springboot,防止反编译
本示例项目"spring(tomcat)前后端数据加密传输demo"提供了一个基于Spring Boot和Tomcat环境的解决方案,用于演示如何实现前后端数据的加密传输。以下是这个项目中涉及的关键知识点: 1. **Spring Boot**: Spring ...
Tomcat支持多种安全机制,如SSL/TLS加密、基本认证、摘要认证等,可以配置访问控制策略,保护Web应用程序的安全。 8. **部署与配置** 通过修改`server.xml`、`web.xml`等配置文件,可以实现Tomcat的部署和配置,...
该留言本采用JSP+JavaBean+Access开发,直接放到Tomcat下就能运行,不用配置数据源。 含有UBB代码和UBB头像,采用正则表达式制作。 管理登陆加入验证码,数据库管理密码采用MD5加密。
首先,Tomcat是Apache软件基金会下的一个开源项目,是一款轻量级的应用服务器,主要支持Java Servlet和JavaServer Pages(JSP)技术。它以其小巧、高效、易用的特点,成为了许多初学者和小型企业首选的Java Web...
4. **安全性**:Tomcat提供了多种安全机制,包括基本认证、摘要认证、SSL/TLS加密等。配置`context.xml`和`server.xml`中的`<Realm>`和`<User>`元素来进行用户权限管理。 5. **性能优化**:包括调整JVM参数(如堆...
8. **Security**: Tomcat支持SSL/TLS加密,可以通过配置`server.xml`文件启用。此外,还可以通过Realm组件实现用户认证和授权。 9. **Demo应用**: 提供的源代码中可能包含了几个小的示例应用,这些应用展示了Tomcat...
本文将详细探讨“tomcat源码依赖包”这一主题,旨在帮助读者更好地理解和构建Tomcat6及其之前版本的源代码。 首先,我们来谈谈“jar”标签。在Java开发中,jar(Java Archive)文件是一种打包格式,它将类文件、...
8. **安全**:Tomcat支持多种安全特性,如SSL/TLS加密、用户认证和授权,以及角色基的安全管理。开发者可以通过修改配置文件来实施安全策略。 源码分析部分可能包括Tomcat的启动过程、请求处理流程、线程池管理、...
解析这些文件的代码位于`org.apache.tomcat.util.digester`包下。 通过研究这些源代码,开发者可以了解到如何实现一个Servlet容器,如何处理网络请求,以及如何设计高效的并发处理机制等。同时,这也有助于开发者在...