本章讨论如何在配置文件中保存用国密算法加密之后的数据库密码,以及如何在运行的时候对其解密。
修改配置文件
- 删除配置文件中的 spring.datasource.password
- 在配置文件中增加如下内容
```yaml
Spring:
datasource:
druid:
password: "*****"
password-callback-class-name: com.longser.encrypt.DatabasePasswordCallback
connect-properties.password: BDQbU3/MkUMo44PadhhTNZHxQ6xq1KWG
上述配置中,connect-properties.password 保存的是用 SM2 加密算法的公钥加密后的数据库密码。为了防止泄露,在写文档的时候,我把只保留了实际结果的一小部分。
<a name="CWacz"></a>
## 编写 druid 密码回调类
代码如下
```java
package com.longser.encrypt;
import com.alibaba.druid.util.DruidPasswordCallback;
import com.alibaba.druid.util.StringUtils;
import com.longser.crypto.SM2;
import lombok.SneakyThrows;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.springframework.stereotype.Component;
import java.util.Base64;
import java.util.Properties;
@Component("DatabasePasswordCallback")
public class DatabasePasswordCallback extends DruidPasswordCallback {
private String privateKey = "MIIBUQIBAQQgQyqY+BGIx6b*********";
@SneakyThrows
@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
String password = properties.getProperty("password");
BCECPrivateKey sm2PrivateKey = SM2.getPrivteKeyFromBase64(privateKey);
if(!StringUtils.isEmpty(password)){
byte[] decryptedData = SM2.decrypt(sm2PrivateKey, Base64.getDecoder().decode(password));
String decryptedPassword = new String(decryptedData);
System.out.println("The Password is " + decryptedPassword);
setPassword(decryptedPassword.toCharArray());
}
}
}
上述代码中的 privateKey 也不是真实的,你要换成自己的。另外,由于这个回调类的特殊性质,目前还没有找到一个好办法从变成配置文件中读取私钥的。反正写在这里似乎也更安全一些。