本章讨论如何在配置文件中保存用国密算法加密之后的数据库密码,以及如何在运行的时候对其解密。
修改配置文件
- 删除配置文件中的 spring.datasource.password
- 在配置文件中增加如下内容
```yaml
Spring:
datasource:
druid:
password: "*****"password-callback-class-name: com.longser.encrypt.DatabasePasswordCallbackconnect-properties.password: BDQbU3/MkUMo44PadhhTNZHxQ6xq1KWG
上述配置中,connect-properties.password 保存的是用 SM2 加密算法的公钥加密后的数据库密码。为了防止泄露,在写文档的时候,我把只保留了实际结果的一小部分。<a name="CWacz"></a>## 编写 druid 密码回调类代码如下```javapackage 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@Overridepublic 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 也不是真实的,你要换成自己的。另外,由于这个回调类的特殊性质,目前还没有找到一个好办法从变成配置文件中读取私钥的。反正写在这里似乎也更安全一些。
