c3p0数据源用户名密码加密

一、cn.com.encrypt.java

package cn.com.encrypt;

import java.io.ByteArrayOutputStream;
import java.util.Properties;

import javax.crypto.Cipher;

import org.springframework.beans.factory.FactoryBean;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class DBEncrypt implements FactoryBean {

	private Properties properties;

	public Object getObject() throws Exception {
		return getProperties();
	}

	public Class getObjectType() {
		return java.util.Properties.class;
	}

	public boolean isSingleton() {
		return true;
	}

	public Properties getProperties() {
		return properties;
	}

	public void setProperties(Properties inProperties) {
		this.properties = inProperties;
		String originalUsername = properties.getProperty("user");
		String originalPassword = properties.getProperty("password");
		if (originalUsername != null) {
			String newUsername = deEncryptUsername(originalUsername);
			properties.put("user", newUsername);
		}
		if (originalPassword != null) {
			String newPassword = deEncryptPassword(originalPassword);
			properties.put("password", newPassword);
		}
	}

	private String deEncryptUsername(String originalUsername) {
		return dCode(originalUsername.getBytes());
	}

	private String deEncryptPassword(String originalPassword) {
		return dCode(originalPassword.getBytes());
	}

	public String eCode(String needEncrypt) {
		byte result[] = null;
		try {
			Cipher enCipher = Cipher.getInstance("DES");
			javax.crypto.SecretKey key = Key.loadKey();
			enCipher.init(1, key);
			result = enCipher.doFinal(needEncrypt.getBytes());
			BASE64Encoder b = new BASE64Encoder();
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			b.encode(result, bos);
			result = bos.toByteArray();
		} catch (Exception e) {
			throw new IllegalStateException(
					"System doesn't support DES algorithm.");
		}
		return new String(result);
	}

	public String dCode(byte result[]) {
		String s = null;
		try {
			Cipher deCipher = Cipher.getInstance("DES");
			deCipher.init(2, Key.loadKey());
			BASE64Decoder d = new BASE64Decoder();
			result = d.decodeBuffer(new String(result));
			byte strByte[] = deCipher.doFinal(result);
			s = new String(strByte);
		} catch (Exception e) {
			throw new IllegalStateException(
					"System doesn't support DES algorithm.");
		}
		return s;
	}

	public static void main(String[] args) {
		String s = "test";
		DBEncrypt p = new DBEncrypt();
		String afterE = p.eCode(s);
		System.out.println("after:"+afterE);//这里是加密后的字符
		System.out.println("before:"+p.dCode(afterE.getBytes()));
	}
}
 

二、cn.com.encrypt.Key.java

package cn.com.encrypt;

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import sun.misc.BASE64Decoder;

public class Key {
	private static String encryptKey = "7EV/Zzutjzg=";

	public Key() {
	}

	public static SecretKey loadKey() throws Exception {
		BASE64Decoder d = new BASE64Decoder();
		byte b[] = d.decodeBuffer(encryptKey);
		DESKeySpec dks = new DESKeySpec(b);
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		return keyFactory.generateSecret(dks);
	}
}
 

三、cn.com.encrypt.PropertiesEncryptFactoryBean.java

package cn.com.encrypt;

import java.util.Properties;

import org.springframework.beans.factory.FactoryBean;

public class PropertiesEncryptFactoryBean implements FactoryBean {

	private Properties properties;

	public Object getObject() throws Exception {
		return getProperties();
	}

	public Class getObjectType() {
		return java.util.Properties.class;
	}

	public boolean isSingleton() {
		return true;
	}

	public Properties getProperties() {
		return properties;
	}

	public void setProperties(Properties inProperties) {
		this.properties = inProperties;
		String originalUsername = properties.getProperty("user");
		String originalPassword = properties.getProperty("password");
		if (originalUsername != null) {
			String newUsername = deEncryptUsername(originalUsername);
			properties.put("user", newUsername);
		}
		if (originalPassword != null) {
			String newPassword = deEncryptPassword(originalPassword);
			properties.put("password", newPassword);
		}
	}

	private String deEncryptUsername(String originalUsername) {
		return deEncryptString(originalUsername);
	}

	private String deEncryptPassword(String originalPassword) {
		return deEncryptString(originalPassword);
	}

	private String deEncryptString(String originalString) {
		return new DBEncrypt().dCode(originalString.getBytes());
	}

}
 

四、config.properties

CHECK_ST_ORL_URL=jdbc:oracle:thin:@127.0.0.1:1521:rac
CHECK_ST_ORL_USER=qBEWE7vGhBs=
CHECK_ST_ORL_PASSWD=qBEWE7vGhBs=
CHECK_ST_ORL_driverClassName=oracle.jdbc.driver.OracleDriver

五、applicationContext.xml

<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>/WEB-INF/classes/config.properties</value>
			</list>
		</property>
	</bean>
<bean id="dataSourceOracle"
		class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="automaticTestTable" value="CONNECTION_TEST" />
		<property name="testConnectionOnCheckout" value="true" />
		<property name="acquireRetryAttempts" value="5" />
		<property name="driverClass">
			<value>${CHECK_ST_ORL_driverClassName}</value>
		</property>
		<property name="jdbcUrl">
			<value>${CHECK_ST_ORL_URL}</value>
		</property>
		<property name="properties" ref="dataSourceProperties"/>
		<property name="minPoolSize">
			<value>30</value>
		</property>
		<property name="maxPoolSize">
			<value>100</value>
		</property>
		<property name="initialPoolSize">
			<value>30</value>
		</property>
		<property name="maxConnectionAge">
			<value>1800</value>
		</property>
		<property name="maxIdleTime">
			<value>1800</value>
		</property>
		<property name="maxIdleTimeExcessConnections">
			<value>300</value>
		</property>
		<property name="maxStatements">
			<value>0</value>
		</property>
		<property name="testConnectionOnCheckin">
			<value>false</value>
		</property>
		<property name="idleConnectionTestPeriod">
			<value>900</value>
		</property>
		<property name="checkoutTimeout">
			<value>1000</value>
		</property>
	</bean>
	<bean id="dataSourceProperties" class="cn.com.encrypt.PropertiesEncryptFactoryBean">  
        <property name="properties">  
            <props>  
                <prop key="user">${CHECK_ST_ORL_USER}</prop>  
                <prop key="password">${CHECK_ST_ORL_PASSWD}</prop>  
            </props>  
        </property>  
    </bean> 
 

猜你喜欢

转载自yang8787jie-126-com.iteye.com/blog/1508454
今日推荐