皕杰技术社区

 找回密码
 立即加入

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1267|回复: 4

[分享] Tomcat连接池加密

[复制链接]
发表于 2018-11-23 13:50:39 | 显示全部楼层 |阅读模式
一、说明
Tomcat配置JNDI数据源时密码是以明文的形式出现在配置文件中,这样存在安全隐患,比较可取的方法是将配置文件用户相关的信息(例如:用户名、密码)进行加密使其以密文形式存在,进行初始化连接池的时候进行解密操作,达到成功创建连接池的目的。(附录是对tomcat加载过程的说明,若对其不明白请先阅读)
二、加密实现方式
第一种方式比较简单,直接修改BasicDataSourceFactory.java中读取加密字段部分
setPassword(value)----value是直接从配置文件中取到字符串值,此处加入解密方法获取明文即可达到目的。该方式优点是简单(网上相关介绍比较多),缺点也比较明显,适合于个人项目的实践练习,不适合与实际运行项目。

 楼主| 发表于 2018-11-23 13:52:00 | 显示全部楼层
修改BasicDataSourceFactory.java之后,所有的连接池初始化操作均采用相同的加密解密接口,tomcat之下部署的工程可能是多个公司,或者是一个公司不同时期的产品,强迫使用同一种方式不符合实际情形。
可能出现以下场景:A_1项目利用B_1加解密模块,A_2项目利用B_2加解密模块,A_3项目不利用加解密模块等等,以上方式明显无法处理,所以其适用范围比较窄。
第二种方式比较专业,前提需要了解dbcp中的工厂模式。分析源代码可知BasicDataSourceFactory.java实现了接口javax.naming.spi.ObjectFactory,我们也实现该接口初始内容保持和BasicDataSourceFactory.java相同即可,之后修改参照第一种方式。只要可以在配置文件中控制加载当前配置文件类,即可达到加解密的目的。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-23 13:54:03 | 显示全部楼层
查阅JNDI设置相关知识发现Resource中有个参数factory,可以指定加载当前配置文件的类,若没有指定则默认采用BasicDataSourceFactory.java。
三、完整实例
(加密解密模块比较简单只是用来说明问题,密文为明文的十六进制串)
1 新建类BasicDataSourceFactoryDigest.java,内容与BasicDataSourceFactory.java完全一致。
2 BasicDataSourceFactoryDigest.java末尾添加如下内容
  1. //编码-普通字符串转为十六进制字符串
  2. public static String encode(String password){
  3. String result = "";
  4. byte[] psd = password.getBytes();
  5. for(int i=0;i<psd.length;i++){
  6. result += Integer.toHexString(psd[i]&0xff);
  7. }
  8. return result;
  9. }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-23 13:56:19 | 显示全部楼层
  1. //解码--十六进制字符串转为普通字符串
  2. public static String decode(String password){
  3. String result = "";
  4. password = password.toUpperCase();   
  5. int length = password.length() / 2;   
  6.     char[] hexChars = password.toCharArray();   
  7.     byte[] d = new byte[length];   
  8.     for (int i = 0; i < length; i++) {   
  9.         int pos = i * 2;   
  10.    d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));   
  11.    }   
  12.     result = new String(d);
  13. return result;
  14. }
  15. //字符转字节
  16. public static byte charToByte(char c) {   
  17.     return (byte) "0123456789ABCDEF".indexOf(c);   
  18. }
复制代码

4 打包为tomcat_dbcp_encrypt.jar,复制到Tomcat/lib目录,重新启动tomcat测试通过

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-23 14:31:41 | 显示全部楼层

附录:

Tomcat连接池采用DBCP(基于common-pool的一种连接池实现),上文就是修改dbcp源代码,BasicDataSourceFactory.java类包为org.apache.tomcat.dbcp.dbcp。下载DBCP源码之后需要确保包路径和tomcat/lib/tomcat_dbcp.jar中的一致(查看包路径方法:将jar包复制到WEB工程的lib中,)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

QQ|小黑屋|手机版|皕杰软件 ( 京ICP备14050931号 )

GMT+8, 2025-6-14 06:17 , Processed in 1.118146 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表