zoukankan      html  css  js  c++  java
  • (转)Tomcat数据源连接池加密

    文章来源 :http://my.oschina.net/cimu/blog/164757

    我们在使用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”为你的自定义类,下面是相关代码:

     1 package net.uni.ap.jdbc;
     2 import java.util.Enumeration;
     3 import java.util.Hashtable;
     4 import javax.naming.Context;
     5 import javax.naming.Name;
     6 import javax.naming.RefAddr;
     7 import javax.naming.Reference;
     8 import javax.naming.StringRefAddr;
     9 import org.apache.commons.dbcp.BasicDataSourceFactory;
    10 import com.fesco.fws.utils.TeaUtil;
    11 /**
    12  * 
    13  * @author sunwill
    14  * 
    15  */
    16 public class EncryptedDataSourceFactory extends BasicDataSourceFactory {
    17  public Object getObjectInstance(Object obj, Name name, Context nameCtx,
    18  Hashtable environment) throws Exception {
    19  if (obj instanceof Reference) {
    20  setUsername((Reference) obj);
    21  setPassword((Reference) obj);
    22  }
    23  return super.getObjectInstance(obj, name, nameCtx, environment);
    24  }
    25 private void setUsername(Reference ref) throws Exception {
    26  findDecryptAndReplace("username", ref);
    27  }
    28 private void setPassword(Reference ref) throws Exception {
    29  findDecryptAndReplace("password", ref);
    30  }
    31 private void findDecryptAndReplace(String refType, Reference ref)
    32  throws Exception {
    33  int idx = find(refType, ref);
    34  String decrypted = decrypt(idx, ref);
    35  replace(idx, refType, decrypted, ref);
    36  }
    37 private void replace(int idx, String refType, String newValue, Reference ref)
    38  throws Exception {
    39  ref.remove(idx);
    40  ref.add(idx, new StringRefAddr(refType, newValue));
    41  }
    42 private String decrypt(int idx, Reference ref) throws Exception {
    43  return TeaUtil.decryptByTea(ref.get(idx).getContent().toString());
    44  }
    45 private int find(String addrType, Reference ref) throws Exception {
    46  Enumeration enu = ref.getAll();
    47  for (int i = 0; enu.hasMoreElements(); i++) {
    48  RefAddr addr = (RefAddr) enu.nextElement();
    49  if (addr.getType().compareTo(addrType) == 0) {
    50  return i;
    51  }
    52  }
    53  throw new Exception("The "" + addrType
    54  + "" name/value pair was not found"
    55  + " in the Reference object. The reference Object is" + " "
    56  + ref.toString());
    57  }}

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

    <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>
  • 相关阅读:
    玩具数据库
    数据库中可能会出现的表
    SqlDbHelper
    重写 覆盖 虚方法
    页面标签的初始化
    如何将UTF8转换为UTF8n
    小软件项目开发的管理(转)
    SCRUM软件开发过程(转)
    在.Net如何制作自定义的快捷方式
    What Is a Leader
  • 原文地址:https://www.cnblogs.com/benefitworld/p/5832668.html
Copyright © 2011-2022 走看看