加密数据库操作
需求:在项目都完成之后,发现yaml配置里面的数据库账号密码都是明文的,为了安全起见,需要在不改动原有的代码基础上,完成加密操作
项目中使用的是hikari数据连接池(durid连接池是同样的操作,将第二步的继承对象改为duridDataSource就行)
原来配置:
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
max-lifetime: 2000000
maximum-pool-size: 5
minimum-idle: 3
auto-commit: true
connection-timeout: 30000
username: ws
password: 123456 //这里的MySQL密码都是明文,不安全
jdbc-url: jdbc:mysql://localhost:3306/mmmma?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull
加密yaml明文密码
-
选择加密工具
- 这里我就直接省略了,自己找个EncryUtils就行
-
新建config类继承HikariDataSource,重写getPassword方法。
-
public class DataSourceConfig extends HikariDataSource { private final Boolean encryption = true; @Override public String getPassword() { String oldPassword = super.getPassword(); if (!encryption) return oldPassword; if (null == oldPassword) return null; try { oldPassword = EncryptionUtils.decrypt(oldPassword); return oldPassword; } catch (Exception e) { throw new RuntimeException("数据库密码解密失败!", e); } } }
-
-
用新的config类生成datasource
-
@Configuration public class HikariSource { @Bean(name = "dataSource") @Primary @ConfigurationProperties(ignoreUnknownFields = false,prefix="spring.datasource.hikari") public HikariDataSource hikariDataSource() { HikariDataSource dataSourceConfig = new DataSourceConfig(); return dataSourceConfig; } }
-
-
重写编写yaml
-
spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver hikari: max-lifetime: 2000000 maximum-pool-size: 5 minimum-idle: 3 auto-commit: true connection-timeout: 30000 username: ws password: 加密后字段xxxx //这里的MySQL密码都是明文,不安全 jdbc-url: jdbc:mysql://localhost:3306/mmmma?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull
-
排错:
- 经常会遇到加密之后,项目跑不起来,数据库连接错误
- 通常的问题就是第三步的用新的config类生成datasource没有生效
- 这边特别的要注意yaml的配置地址
- 这边我们将数据库的userName password url都放在的spring.datasource.hikara的下面,这个要严格遵守,要不然@ConfigurationProperties(ignoreUnknownFields = false,prefix=“spring.datasource.hikari”)就会找不到配置