Tomcat数据源连接池加密

我们在使用Tomcat数据库连接池的时候都是明文存储数据库用户名和密码的,例如:

<Resource name="ODS" type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.1.1:1521:dbid" username="oracle" password="oracle" maxIdle="4" maxActive="6" maxWait="5000" />

如果我们不想让数据库的密码暴露在web容器中怎么办呢?写一个类继承org.apache.commons.dbcp.BasicDataSourceFactory,然后指定factory=”*.EncryptedDataSourceFactory”为你的自定义类,下面是相关代码

package net.uni.ap.jdbc; import java.util.Enumeration; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.StringRefAddr; import org.apache.commons.dbcp.BasicDataSourceFactory; import com.fesco.fws.utils.TeaUtil; /** * * @author sunwill *
*/ public class EncryptedDataSourceFactory extends BasicDataSourceFactory { public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception { if (obj instanceof Reference) {
setUsername((Reference) obj); setPassword((Reference) obj); }
return super.getObjectInstance(obj, name, nameCtx, environment); } private void setUsername(Reference ref) throws Exception {
findDecryptAndReplace("username", ref); } private void setPassword(Reference ref) throws Exception {
findDecryptAndReplace("password", ref); } private void findDecryptAndReplace(String refType, Reference ref) throws Exception { int idx = find(refType, ref); String decrypted = decrypt(idx, ref); replace(idx, refType, decrypted, ref); }
private void replace(int idx, String refType, String newValue, Reference ref) throws Exception { ref.remove(idx);
ref.add(idx, new StringRefAddr(refType, newValue)); } private String decrypt(int idx, Reference ref) throws Exception { return TeaUtil.decryptByTea(ref.get(idx).getContent().toString()); }
private int find(String addrType, Reference ref) throws Exception {
Enumeration enu = ref.getAll(); for (int i = 0; enu.hasMoreElements(); i++) { RefAddr addr = (RefAddr) enu.nextElement(); if (addr.getType().compareTo(addrType) == 0) {
return i; } } throw new Exception("The "" + addrType + "" name/value pair was not found" + " in the Reference object. The reference Object is" + " " + ref.toString()); }}

其中红色的地方是你的数据库密码解密方法,当然对应的也要有加密算法,加密后的串放到连接池的地方:

<Context path="">

<Resource name="ODS" type="javax.sql.DataSource"

driverClassName="oracle.jdbc.driver.OracleDriver"
factory="net.uni.ap.jdbc.EncryptedDataSourceFactory"
url="jdbc:oracle:thin:@192.168.1.1:1521:sid" username="oracle"
password="C65BD76C4CED33C446B289F64CAFACC5" maxIdle="4"
maxActive="6" maxWait="5000" /> </Context>

转载于:https://my.oschina.net/u/1188115/blog/172519

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值