tomcat数据库连接池密码加密

   应用部署到tomcat上后,数据库连接信息通常配置在context.xml,默认配置都是明文形式,如数据库用户名、密码等,这样可能会导致配置信息被其他人窃取,造成安全隐患,下面介绍下通过对配置信息加解密来保证数据库的安全性。

   Tomcat默认使用的是DBCP数据库连接池,所以可以通过更改DBCP来实现配置信息的加解密,不同tomcat版本具体实现方式不太一样,这里介绍tomcat7及以上版本的设置方法。

  DBCP数据库连接池默认控制类是Tomcat/lib/tomcat-dbcp.jar 中的org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory.class,可以通过反编译工具反编译下,或者去apache官网下载对应版本tomcat的源码,更改该类编译后替换到相应jar中即可,但是一经替换,该tomcat下所有连接池都会走同样的配置,在实际应用中不太灵活,实际上,在数据库连接配置时可以指定相应的DBCP类,如:

   <Resource name="orcl" auth="Container"type="javax.sql.DataSource"

username="runqian"password="\u0072\u0075\u006e\u0071\u0069\u0061\u006e"

driverClassName="oracle.jdbc.driver.OracleDriver"

url="jdbc:oracle:thin:@localhost:1521:orcl"

maxActive="100"

maxIdle="30"

maxWait="100"

factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory1"

/>

在该连接池中,factory可以指定DBCP处理类,到时候数据库连接时会通过该类进行处理。

本例中password用unicode进行了编码处理,这样只需要在org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory1中进行解码即可,找到:

value =properties.getProperty("password");

       if(value != null)

           dataSource.setPassword(decodeUnicode(value));

在这里用decodeUnicode对获取到的密码进行解码即可,decodeUnicode类源码:

public static String decodeUnicode(Stringstr) {

               Charset set =Charset.forName("UTF-16");

               Pattern p =Pattern.compile("\\\\u([0-9a-fA-F]{4})");

               Matcher m = p.matcher( str );

               int start = 0 ;

               int start2 = 0 ;

               StringBuffer sb = new StringBuffer();

               while( m.find( start ) ) {

                start2 = m.start() ;

                if( start2 > start ){

                 String seg = str.substring(start, start2) ;

                 sb.append( seg );

                }

                String code = m.group( 1 );

                int i = Integer.valueOf( code , 16 );

                byte[] bb = new byte[ 4 ] ;

                bb[ 0 ] = (byte) ((i >> 8) & 0xFF);

                bb[ 1 ] = (byte) ( i & 0xFF ) ;

                ByteBuffer b = ByteBuffer.wrap(bb);

                sb.append( String.valueOf( set.decode(b)).trim() );

                start = m.end() ;

               }

               start2 = str.length() ;

               if( start2 > start ){

                String seg = str.substring(start, start2) ;

                sb.append( seg );

               }

               return sb.toString() ;

              }

这样就可以实现对密码的加解密操作,本例中实现了对密码的unicode编码,实际中可以通过其他加密方式加密,只需要在DBCP处理类中用相应的方式解密即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值