Tomcat數據源連接池加密

jopen 11年前發布 | 27K 次閱讀 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>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!