三种springMVC项目、springboot项目配置文件加密解密方法
为了项目的安全,今天项目需要用到配置文件(有XML和Java两种文件的)加解密,由于项目年久失修,项目逐渐分出了多个服务,有springMVC模式的,也有springBoot版本的,今天给大家呈现这两种项目的自定义加密方式。
一、springMVC模式
1.自定义一个类,继承PropertyPlaceholderConfigurer类
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import java.util.Properties;
public class PropertyPlaceholderConfigurerExt extends PropertyPlaceholderConfigurer {
//自定义解密方式,可以使用解密接口解密(自己写的解密服务),也可以使用常规AES秘钥解密方式等解密
private String URL_KEY = "service.url";
Logger log=Logger.getLogger(PropertyPlaceholderConfigurerExt.class);
@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {
String url = props.getProperty(URL_KEY);
//一般的解密接口地址也可以先加密,使用的时候再解密
String durl = AES.dec(url);//解密接口地址
log.debug("========load durl:"+durl);
props.setProperty(URL_KEY, durl);
if(url != null && !url.equals("")){
for(String s:prop){
//自定义的解密方式(这里是调用接口解密的),这里不贴了
String unwrapData = DataSafeUtil.unwrapData(props.getProperty(s));
log.debug("========load prop ["+s+"]: " + unwrapData);
props.setProperty(s,unwrapData);//解密后的数据放回Properties
}
}
super.processProperties(beanFactoryToProcess, props);
}
/*
* 这个数组放properties文件中需要解密的常量key
*/
private String[] prop = {
"database.url",
"database.username",
"database.password"
};
}
2.在applicationContext.xml文件注册上面自定义PropertyPlaceholderConfigurerExt类,注意applicationContext.xml文件中只允许注册一次加载配置文件的bean,以前存在的可以替换掉
代码如下:
<!-- 加载 解密 配置文件 -->
<bean id="placeholderConfig" class="com.**.encryption.PropertyPlaceholderConfigurerExt">
<property name="locations">
<list>
<value>classpath:database.properties</value>
<value>classpath:memcached.properties</value>
</list>
</property>
</bean>
3.配置文件中设置已经使用自己的方式加密好的数据
**附件:**加密文件
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
public class AES
{