本章讨论如何在配置文件中保存用国密算法加密之后的数据库密码,以及如何在运行的时候对其解密。

修改配置文件

  • 删除配置文件中的 spring.datasource.password
  • 在配置文件中增加如下内容 ```yaml Spring: datasource: druid:
    1. password: "*****"
    2. password-callback-class-name: com.longser.encrypt.DatabasePasswordCallback
    3. connect-properties.password: BDQbU3/MkUMo44PadhhTNZHxQ6xq1KWG
  1. 上述配置中,connect-properties.password 保存的是用 SM2 加密算法的公钥加密后的数据库密码。为了防止泄露,在写文档的时候,我把只保留了实际结果的一小部分。
  2. <a name="CWacz"></a>
  3. ## 编写 druid 密码回调类
  4. 代码如下
  5. ```java
  6. package com.longser.encrypt;
  7. import com.alibaba.druid.util.DruidPasswordCallback;
  8. import com.alibaba.druid.util.StringUtils;
  9. import com.longser.crypto.SM2;
  10. import lombok.SneakyThrows;
  11. import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
  12. import org.springframework.stereotype.Component;
  13. import java.util.Base64;
  14. import java.util.Properties;
  15. @Component("DatabasePasswordCallback")
  16. public class DatabasePasswordCallback extends DruidPasswordCallback {
  17. private String privateKey = "MIIBUQIBAQQgQyqY+BGIx6b*********";
  18. @SneakyThrows
  19. @Override
  20. public void setProperties(Properties properties) {
  21. super.setProperties(properties);
  22. String password = properties.getProperty("password");
  23. BCECPrivateKey sm2PrivateKey = SM2.getPrivteKeyFromBase64(privateKey);
  24. if(!StringUtils.isEmpty(password)){
  25. byte[] decryptedData = SM2.decrypt(sm2PrivateKey, Base64.getDecoder().decode(password));
  26. String decryptedPassword = new String(decryptedData);
  27. System.out.println("The Password is " + decryptedPassword);
  28. setPassword(decryptedPassword.toCharArray());
  29. }
  30. }
  31. }

上述代码中的 privateKey 也不是真实的,你要换成自己的。另外,由于这个回调类的特殊性质,目前还没有找到一个好办法从变成配置文件中读取私钥的。反正写在这里似乎也更安全一些。