配置文件中展示了密码明文,审查不允许,要求加密。
1 druid实现单数据源加密
1.添加依赖 ,加密密码
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
2.加密密码,
找到jar包druid-1.1.9.jar,注意这个jar包和上面的不是一个,在这个jar包的位置下,进入cmd,使用命令实现加密
java -cp druid-1.1.9.jar com.alibaba.druid.filter.config.ConfigTools 你的密码 >a.txt,
复制 公钥publickey和加密后的密码password,在配置文件中将密码替换成加密后的,并添加下面两个配置
public-key=你生成的公钥
spring.datasource.druid.filter.config.enabled=true
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
2 druid实现多数据源加密
首先你的代码中dao类和mpper类是否根据数据源分包,不然我下面的方法没有办法实现。
多数据源配置
@Configuration
public class MultiDataSourceConfig {
@Bean(name = "datasource1")//数据源名称1
@ConfigurationProperties(prefix = "spring.datasource.druid.datasource1")
public DataSource dataSource1() {
return new DruidDataSource();
}
@Bean(name = "server")//数据源名称2
@ConfigurationProperties(prefix = "spring.datasource.druid.server")
public DataSource dataSource2() {
return new DruidDataSource();
}
}
具体单个数据源配置,这里只是一个数据源,另外一个数据源也要配置,只需要替换参数就可以。
@Configuration
@MapperScan(basePackages = "cn.com.hello.zydt.dao", sqlSessionTemplateRef = "test2SqlSessionTemplate")//这里指定数据源对应的dao包,和另外一个数据源不能重合
public class DataSource2Config {
@Bean(name = "test2SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("server") DataSource dataSource) throws Exception {//这里的server是数据源的名称
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:config/mappers/*" +//执行的对应xml文件路径
".xml"));
return bean.getObject();
}
@Bean(name = "test2TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("server") DataSource dataSource) {//同样是数据源名称
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "test2SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
druid自定义解密回调函数
不同于单个数据加密,多数据源加密需要配置回调函数
public class DbPasswordCallback extends DruidPasswordCallback {
private static final Logger logger = LoggerFactory.getLogger(DbPasswordCallback.class);
@Override
public void setProperties(Properties properties){
super.setProperties(properties);
String publickey = "";
//获取application里面配置的密码和公钥
String password = (String) properties.get("password");
publickey = (String) properties.get("publicKey");
try {
String dbpassword = ConfigTools.decrypt(publickey, password);
setPassword(dbpassword.toCharArray());
} catch (Exception e) {
logger.error("Druid ConfigTools.decrypt", e);
}
}
}
修改配置文件
public-key = 你生成的公钥
spring.datasource.druid.server.name=server//指定数据源名称
spring.datasource.druid.server.filter.config.enabled=true
spring.datasource.druid.server.connection-properties=config.decrypt=true;publicKey=${public-key};password=${spring.datasource.password}
spring.datasource.druid.server.password-callback-class-name = xxx.xxx.DbPasswordCallback//指定解密函数
3 jasypt 加密
上面的方法如果dao类本来分包了,要改动的地方就很少,而且不用添加jar包。但如果不是,就需要自己分包,改动是一个大工程。jasypt是一个专门加密的包,可以对任何配置项进行加密。
1.添加依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
2.对密码进行加密
public class JasyptUtil {
/**
* 解密方法
* @param password
* @param value
* @return
*/
private static String decyptPwd(String password, String value) {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setConfig(cryptor(password));
return encryptor.decrypt(value);
}
/**
* 加密方法
* @param password
* @param value
* @return
*/
private static String encyptPwd(String password, String value) {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setConfig(cryptor(password));
return encryptor.encrypt(value);
}
/**
* 配置信息
* @param password
* @return
*/
private static SimpleStringPBEConfig cryptor(String password) {
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(password);
config.setAlgorithm("PBEWithMD5AndDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setStringOutputType("base64");
return config;
}
/* public static void main(String[] args) {
String slat = "cfds";
// 加密
String encPwd = encyptPwd(slat, "未加密的密码");
//解密
String decPwd = decyptPwd(slat, encPwd);
System.out.println("加密后的密码:" + encPwd);
}*/
}
3.配置信息修改
#加密配置项
jasypt.encryptor.password=cfds//加密的密钥
jasypt.encryptor.algorithm=PBEWithMD5AndDES//指定了加密算法
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator//指定了初始化向量(IV)生成器的类名
#加密后的密码
spring.datasource.server.password=ENC(vydZNCy0vVNFhdrV+R94Ki)
记录使用,欢迎交流。