spring框架在一些对安全性要求较高的生产环境下,配置文件不允许出现明文用户名密码配置,如数据库配置等。本文主要用于解决明文用户名密码加密。
通过继承spring配置类并重写处理方法实现密文解密
public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
private String[] encryptPropNames = {"username", "password"};
@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactory,
Properties props) throws BeansException {
try {
for (int i = 0;i<encryptPropNames.length;i++){
String value = props.getProperty(encryptPropNames[i]);
if (value != null) {
props.setProperty(encryptPropNames[i],new String(DES.decrypt(new BASE64Decoder().decodeBuffer(value), "解密秘钥")));
}
}
super.processProperties(beanFactory, props);
} catch (Exception e) {
e.printStackTrace();
throw new BeanInitializationException(e.getMessage());
}
}
}
配置applicationContext.xml文件,并在jdbc.properties中设置密文(根据解密秘钥生成)
<!-- class填写刚才那段代码的类路径-->
<bean id="propertyConfigurer" class="com.**.EncryptPropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
第二种方式
package com.zheng.common.plugin;
import com.zheng.common.util.AESUtil;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
private String[] propertyNames = {
"master.jdbc.password", "slave.jdbc.password", "generator.jdbc.password", "master.redis.password"
};
/**
* 解密指定propertyName的加密属性值
* @param propertyName
* @param propertyValue
* @return
*/
@Override
protected String convertProperty(String propertyName, String propertyValue) {
for (String p : propertyNames) {
if (p.equalsIgnoreCase(propertyName)) {
// 加密算法
return AESUtil.aesDecode(propertyValue);
}
}
return super.convertProperty(propertyName, propertyValue);
}
}