使用druid-spring-boot-starter,配置自定义的数据库密码加密回调。
重写com.alibaba.druid.util.DruidPasswordCallbacksetProperties方法。

配置的密码写入密文

特别注意 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();
    }
  }
}

bluesbruce
215 声望17 粉丝