使用Druid的ConfigFilter对数据库密码加解密

it2026-09-26  15

使用Druid的ConfigFilter对数据库密码加解密

一、maven引入druid jar包

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.26</version> </dependency>

二、对数据库密码加密得到公钥、私钥和加密后的密码

[root@zhenglei opt]# ll total 3436 -rw-r--r-- 1 root root 3514896 Oct 22 20:21 druid-1.2.1.jar [root@zhenglei opt]# java -cp druid-1.2.1.jar com.alibaba.druid.filter.config.ConfigTools root privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAuI9AhaiApmmHqkDS5g66N2/dBrCJ/3759TNULsGVmwxBkreFoG2TvFBn/yjDxbt+lV7QFzMsUBmnh02SxXR0QQIDAQABAkAZ7NWNcOwRdEWAXvbBJlR2MRqFNAtOfpGyJfGvV7YiP0tthnrTmBm/vFDmBs6GqnVgsWLKsRd4XBP8vYzsqm6BAiEA2Wr7/iiFOMdECjDX/xU2X7FodKqY5NJnJM0V0+BgZ+kCIQDZT45b+YXEPiA0I9xnjCzpolB4HrAhvjls2Px37EVKmQIhALxzG8q3iomlRldi8MV7uG6HUlfVSsMDkD14udO1ZzqJAiApXX5wvYeb+mNw6V6cC0/FTVNZ+iV21tnhgVBVl5D9CQIgHtzLXwg3hptKUCUnIfmvDux+mGVlad6H+C1qQ9vAaUw= publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALiPQIWogKZph6pA0uYOujdv3Qawif9++fUzVC7BlZsMQZK3haBtk7xQZ/8ow8W7fpVe0BczLFAZp4dNksV0dEECAwEAAQ== password:oAXjNHBKX5BYwsu/MlbuyZvHHijFl0c78vhPqki83oWnOZnHW4z0WjrcImtPbGdh0MV69KyWYPICoLpczg9KXw==

也可以使用druid工具类生成公钥、私钥和密码

//生成密码 System.out.println(ConfigTools.encrypt("私钥", "root")); //其他 API 点击源码ConfigTools

三、创建项目

1. 在application.properties中配置数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://39.98.152.206:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8 spring.datasource.username=root # 密码,使用druid jar生成的密文 spring.datasource.password=oAXjNHBKX5BYwsu/MlbuyZvHHijFl0c78vhPqki83oWnOZnHW4z0WjrcImtPbGdh0MV69KyWYPICoLpczg9KXw== # 公钥 db.public_key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALiPQIWogKZph6pA0uYOujdv3Qawif9++fUzVC7BlZsMQZK3haBtk7xQZ/8ow8W7fpVe0BczLFAZp4dNksV0dEECAwEAAQ==
2. 创建Configuration配置文件
@Configuration public class DBConfig { @Value("${db.public_key}") private String publickey; @Value("${spring.datasource.driver-class-name}") private String className; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Bean public DataSource dataSource() throws SQLException { DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(className); ds.setUrl(url); ds.setUsername(username); ds.setPassword(password); //配置 解密 //设置ConfigFilter为config ds.setFilters("config"); //设置公钥 ds.setConnectionProperties("config.decrypt=true;config.decrypt.key="+publickey); return ds; } }

三、其他方式

若密码解密的方式特殊,可以用extends DruidPasswordCallback方式,重写setProperties方法进行密码解密。这种方式需要将密码 设置到connectionProperties才能在DruidPasswordCallback的Properties 中获取到密码进行解密。

1. 新建DBPasswordCallback 继承DruidPasswordCallback类
public class DBPasswordCallback extends DruidPasswordCallback { //公钥 private String publicKey; public DBPasswordCallback(String publicKey) { this.publicKey = publicKey; } @Override public void setProperties(Properties properties) { super.setProperties(properties); String pwd = properties.getProperty("password"); if (StringUtils.isNotBlank(pwd)) { try { //将密码进行解密 String password = ConfigTools.decrypt(publicKey, pwd); setPassword(password.toCharArray()); } catch (Exception e) { setPassword(pwd.toCharArray()); } } } }
2. 配置application.properties
# 数据库设置 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://39.98.152.206:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=dWtdFRwUuKsm3XgHvp4eKNtp/xT+Tj6i7gqIZWZuUu5SY1fGJY4s5/d4Z2Y1txha6qyyrELx1bllc1+lw73hnouPNjhNpabPoPUeUKcJ0GSK/bjHzRkKdvo5fHFk0RAZ6ODMoJCA83JJpX6XKURpqzX1SR676NZsKq2vXr7+gIM= jdbc.connection-properties=password=${spring.datasource.password} jdbc.public_key=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpmRAcZuqejYP83XUNiLeV7lMhPUXL9Q5myzpfUthOXdsj2hiMPQvRh0aFG1v1faeI1mGeGuMai3xPlt0qdKZ3FX6ZUM5mMG+JRbqeFbeUNmjgrePhCK5byamtxr6NEheCYvNjsCk6Hz1O+hQPtN4GkKC5eUhvCXAiOmPZa+mUSQIDAQAB jdbc.private_key=MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOmZEBxm6p6Ng/zddQ2It5XuUyE9Rcv1DmbLOl9S2E5d2yPaGIw9C9GHRoUbW/V9p4jWYZ4a4xqLfE+W3Sp0pncVfplQzmYwb4lFup4Vt5Q2aOCt4+EIrlvJqa3Gvo0SF4Ji82OwKTofPU76FA+03gaQoLl5SG8JcCI6Y9lr6ZRJAgMBAAECgYEAi7oLogGJe3eIqJtK5eKOdbdNsEc3Va1qhOAxNU2XpyCK8SIGpvPo+tbgvsPDuM8FhFs/ntPUXk9q9yx1dGy8GMCImui7X3YJlDUt83t/ab5cZCovNeijqjVkPtlAFPlKPLrh/2wIbsrtzUXyfNCKyIffLNk3LqdNAmazq/rfiwECQQD3FdpxGQHJFOgWvIG1MEk0NJ65fQDFhMsT2TFmAQMhH6PY06u8M/v/xQMc86vEGL5wFRN7CEB2+vXjR2GyK7rhAkEA8gaixWpHGv/yPbRluwqIpqV6pEituxIW3WLMhdcd++sdfgSq302Zyda9AwzmCIfw1+weM/um+9x+SvAfGpWuaQJBAJDiOpXI4Rgk7zat0K0LJFG9bTk9CF/Jzz7TQ7kZbNlWcUAqVnBkVycSQhIO/DBfhgO5CBRDsXFTFS3xZGMSa2ECQF/rzVscke3bfrCB7MfClwIlF4RA4coAk1tOquxoo5OSTXACfY5e/RKHrwWkeQ7sgcGx7Q6BMF8ltlAQ9uLca/ECQQCQn4gTxcFxSXSLHP/QkJOmHuaIr8GpO2MX3Us0DQFb8DCyxjRsitWkDtJYsbf9F3G0LGjX/bi2gnzdf7lINkaY
3. 创建Configuration配置文件
@Configuration public class DBConfig { @Value("${spring.datasource.driver-class-name}") private String className; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${jdbc.connection-properties}") private String connectionProperties; @Value("${jdbc.public_key}") private String publicKey; @Value("${jdbc.private_key}") private String privateKey; @Bean public DataSource dataSource() throws SQLException { DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(className); ds.setUrl(url); ds.setUsername(username); ds.setPassword(password); //设置解密 ds.setConnectionProperties(connectionProperties); ds.setPasswordCallback(new DBPasswordCallback(publicKey)); return ds; } }
最新回复(0)