一.使用druid连接池对配置文件密码进行加密
① maven依赖jar包
注意: druid 上面的依赖,我之前用1.0.10版本时,在powershell 执行命令的时候 会出现???乱码问题, 后更换为1.0.25时问题解决,原因尚不清楚
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
② 检查jar包是否引入到工程中,并打开jar包目录
③ 点击jar包 --> 右键 show in Expolere 打开找到本地磁盘目录
④ 如果是win10 点击右键打开powershell 命令窗口. 我是win7系统 只能在该路径上手动输入powershell 命令 按下enter 回车键
⑤ 打开命令窗口后 我们执行 命令进行密码加密-加密后privatekey 为私钥, publicKey 公钥 ,password 为你的加密后密码.
注意你jar包的版本号,一定要和命令一致
java -cp druid-1.0.25.jar com.alibaba.druid.filter.config.ConfigTools XXX(你的密码)
⑥ 将密码和公钥复制出来,放到我们spring boot 项目配置文件中
*
注意 公钥我们从安全角度来讲应该放到其它地方而不是放在配置文件里,
*
比如放到服务器上的某个位置
*
生产环境中我们可以设置在启动命令上 java -jar xxx.jar --spring.datasource.druid.publickey=你的公钥
*
测试环境中我们可以 在idea启动参数里
配置文件参数
server:
port: 8090
tomcat:
accesslog:
check-exists: true
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/loterry?useUnicode=true&characterEncoding=utf8
username: root
# 加密后的密文
password: RypyclrY2P+O5KpPtcYe7L7OT3Idl/seT6H7OfRhWZ/vTp41Y3a/yeFFBBHOrTky5sCqrF1UAPLR0t/REsr1Bg==
driver-class-name: com.mysql.jdbc.Driver
druid:
# 公钥
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJkgiwKX0f+OXdbAwXytqkLTaycyw/iKycCdQgvUQ30ddJ6bZcBbjcpND0ovvlxf9KsV5AUSOEIcZFpWKQsYwn8CAwEAAQ==
#设置为true 读取改公钥
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500;config.decrypt=true;config.decrypt.key=${spring.datasource.druid.publickey};
filter:
config:
enabled: true
⑦ 配置好后我们从启项目尝试连接一下数据库-OK没有问题
如果上面配置不生效,自定义配置DruidDataSource 配置文件,进行加密解密
⑧ 我们可以自定义配置DruidDatasource 读取配置文件,也可以从写他的方法, * 这里我使用的是在applation启动类中通过@Bean注解的形式进行注入
package com.example.demo;
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
@ImportResource(locations = "classpath*:/META-INF/spring*.xml")
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Autowired
private Environment env;
//destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用.
@Bean(destroyMethod = "close")
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
String publicKey = env.getProperty("spring.datasource.druid.public-key");
String pwd = env.getProperty("spring.datasource.password");
if (publicKey != null){
try {
dataSource.setPassword(ConfigTools.decrypt(publicKey,pwd));//密码
} catch (Exception e) {
e.printStackTrace();
}
}
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));//用户名
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
dataSource.setInitialSize(2);//初始化时建立物理连接的个数
dataSource.setMaxActive(20);//最大连接池数量
dataSource.setMinIdle(0);//最小连接池数量
dataSource.setMaxWait(60000);//获取连接时最大等待时间,单位毫秒。
dataSource.setValidationQuery("SELECT 1");//用来检测连接是否有效的sql
dataSource.setTestOnBorrow(false);//申请连接时执行validationQuery检测连接是否有效
dataSource.setTestWhileIdle(true);//建议配置为true,不影响性能,并且保证安全性。
dataSource.setPoolPreparedStatements(false);//是否缓存preparedStatement,也就是PSCache
return dataSource;
}
}