使用druid-spring-boot-starter
,配置自定义的数据库密码加密回调。
重写com.alibaba.druid.util.DruidPasswordCallback
的setProperties
方法。
配置的密码写入密文
特别注意 spring.datasource.druid.password
这个属性必须存在,值空或者随便写
# 这个属性必须存在,值空或者随便写
spring.datasource.druid.password=hello
# 自定义加密回调,特别注意,在AesDruidPasswordCallback中,读取这些属性值
spring.datasource.druid.password-callback-class-name=com.bbf.config.AesDruidPasswordCallback
# 在自定义的回调类中,需要读pwd和key的值
spring.datasource.druid.connect-properties.pwd=Icdcxq3YHY56bSgFZOeLHY9eGB75RfReA4EvFFyNxsY=
spring.datasource.druid.connect-properties.key=pXR9pD4KhMGDlmVOQmJDBSJT4iGkXOUso2Fslo2dv3x
解密算法
这里的AesUtil
是自己定义的一种加密算法。实际中可以换成其他的算法。
import com.bbf.util.AesUtil;
import com.alibaba.druid.pool.DruidAbstractDataSource;
import com.alibaba.druid.util.DruidPasswordCallback;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 数据库回调密码解密
* <p>在{@link DruidAbstractDataSource#createPhysicalConnection()}调用PasswordCallback方法时,
* 会把getConnectProperties()的值放入,也就是spring.datasource.druid.connect-properties。
* 不要与spring.datasource.druid.connection-properties混淆</p>
*
* @author BBF
*/
public class AesDruidPasswordCallback extends DruidPasswordCallback {
private static final long serialVersionUID = 8636919602466752407L;
private static final Logger LOGGER = LoggerFactory.getLogger(AesDruidPasswordCallback.class);
@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
// 从druid的connectProperties中获取自定义的配置信息
String pwd = properties.getProperty("pwd");
String key = properties.getProperty("key");
char[] p = null;
try {
if (StringUtils.isNoneBlank(pwd, key)) {
// 解密密码
String newPassword = AesUtil.cbcDecrypt(pwd, key);
p = newPassword.toCharArray();
}
} catch (Exception ex) {
LOGGER.error("[AesDruidPasswordCallback]解密失败:{}", ex.getMessage(), ex);
}
super.setPassword(p);
}
}
密码加密测试类
/**
* 数据库加密测试类
*
* @author BBF
*/
public class AesDruidPasswordCallbackTest {
private static final String PWD = "htdd";
private static final String KEY = "pXR9pD4KhMGDlmVOQmJDBSJT4iGkXOUso2Fslo2dv3x";
@Test
public void encryptPassword() {
try {
String pwd = AesUtil.cbcEncrypt(PWD, KEY);
System.out.println("预期密文:Icdcxq3YHY56bSgFZOeLHY9eGB75RfReA4EvFFyNxsY=");
System.out.printf("计算密文:%s\n", pwd);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。