使用druid-spring-boot-starter
,配置自定义的数据库密码加密回调。
重写com.alibaba.druid.util.DruidPasswordCallback
的setProperties
方法。java
特别注意 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
是本身定义的一种加密算法。实际中能够换成其余的算法。spring
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(); } } }