SSM 框架针对数据库相关配置加密解密操作
主要是3个地方操作
1:spring 加载.properties 文件配置自己的机密操作 该类继承Spring 的PropertyPlaceholderConfigurer 类。重写对应方法 下面有对应代码参考。
2:Spring 加载配置 配置自己的类文件
3: 加密解密类
下面有对应代码作为参考
加密解密代码
package com.v.common.password;
import org.apache.axis.encoding.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;
public class DwDes {
/**
* DES算法密钥
*/
private static final byte[] DES_KEY = { 21, 1, -110, 82, -32, -85, -128, -65 };
/**
* 数据加密,算法(DES)
*
* @param data
* 要进行加密的数据
* @return 加密后的数据
*/
public static String encryptBasedDes(String data) {
String encryptedData = null;
try {
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
DESKeySpec deskey = new DESKeySpec(DES_KEY);
// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(deskey);
// 加密对象
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key, sr);
// 加密,并把字节数组编码成字符串
encryptedData = new Base64().encode(cipher.doFinal(data.getBytes()));
} catch (Exception e) {
// log.error("加密错误,错误信息:", e);
throw new RuntimeException("加密错误,错误信息:", e);
}
return encryptedData;
}
/**
* 数据解密,算法(DES)
*
* @param cryptData
* 加密数据
* @return 解密后的数据
*/
public static String decryptBasedDes(String cryptData) {
String decryptedData = null;
try {
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
DESKeySpec deskey = new DESKeySpec(DES_KEY);
// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(deskey);
// 解密对象
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key, sr);
// 把字符串解码为字节数组,并解密
decryptedData = new String(cipher.doFinal(new Base64().decode(cryptData)));
} catch (Exception e) {
// log.error("解密错误,错误信息:", e);
throw new RuntimeException("解密错误,错误信息:", e);
}
return decryptedData;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="root";
String str2="1qaz2wsx@";
System.out.println(encryptBasedDes("root"));
System.out.println(encryptBasedDes("123456"));
System.out.println(decryptBasedDes("sxxYbV0F3Ek="));
System.out.println(decryptBasedDes("OPmUtIQulsbfYjzGTMo08w=="));
// DES数据加密
// String s1=encryptBasedDes(str);
// System.out.println(s1);
// DES数据解密
// String s2=decryptBasedDes(s1);
// System.err.println(s2);
}
}
Spring 配置文件解密 加载配置信息
<bean
class="com.v.common.jurisdiction.SecretPropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<value>classpath:/sqlservice_datasource.properties</value>
</list>
</property>
</bean>
java 解密文件
package com.v.common.jurisdiction;
import java.util.Properties;
import com.v.common.password.DwDes;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
/**
* 类 : <code>SecretPropertyPlaceholderConfigurer.java</code><br/>
* 描述: <code>数据库文件进行解密操作</code>
*
* @author 作者: {TinVie}
* @version 版本: {V1.0 ,2018年7月14日 下午3:39:51}
* @since JDK版本: {jdk 1.8}
*/
public class SecretPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
public static final String JDBC_DATASOURCE_USERNAME_KEY = "jdbc.username";
public static final String JDBC_DATASOURCE_PASSWORD_KEY = "jdbc.password";
public static final String JDBC_DATASOURCE_URL_KEY = "jdbc.url";
public static final String JDBC_DATASOURCE_DRIVERCLASSNAME_KEY = "jdbc.driverClassName";
@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props)
throws BeansException {
try {
// 解密 账号
String username = props.getProperty(JDBC_DATASOURCE_USERNAME_KEY);
if (username != null) {
props.setProperty(JDBC_DATASOURCE_USERNAME_KEY, DwDes.decryptBasedDes(username));
}
// 解密密码
String password = props.getProperty(JDBC_DATASOURCE_PASSWORD_KEY);
if (password != null) {
props.setProperty(JDBC_DATASOURCE_PASSWORD_KEY, DwDes.decryptBasedDes(password));
}
// 解密URL
// String url = props.getProperty(JDBC_DATASOURCE_URL_KEY);
// if (url != null) {
// props.setProperty(JDBC_DATASOURCE_URL_KEY, DwAes.AESDncode(DwAes.KEY, url));
// }
// 解密驱动
// String driverClassName = props.getProperty(JDBC_DATASOURCE_DRIVERCLASSNAME_KEY);
// if (driverClassName != null) {
// props.setProperty(JDBC_DATASOURCE_DRIVERCLASSNAME_KEY, DwAes.AESDncode(DwAes.KEY, driverClassName));
// }
super.processProperties(beanFactory, props);
} catch (Exception e) {
e.printStackTrace();
throw new BeanInitializationException(e.getMessage());
}
}
}