废话不多说,直接上。避免裸奔最简单的方法。
给数据库配置加密的方式有使用ulisesbocchio进行加密的。但是我认为正常情况下,我们会使用druid连接池,直接使用druid进行加密就好了。避免增加依赖也是一个程序员该有的觉悟。
依赖:
<!-- druid数据源驱动 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
加密方案:
1、执行命令加密数据库密码
java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools you_password
输出:
privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==
2、配置一个加密使用的util方法
import com.alibaba.druid.filter.config.ConfigTools;
import org.junit.Test;
/**
*数据库配置加密使用
* 修改password字符串为对应的密码输出
* copy对应的publicKey放在yml中对应useName中的publicKey和key
* copy对应的password到对应的password
* @author matthew
*/
public class EncryptPwdUtilTest {
@Test
public void EncryptPwdUtil() {
try {
String password = "pwd";
String[] arr = ConfigTools.genKeyPair(512);
System.out.println("publicKey:" + arr[1]);
System.out.println("password:" + ConfigTools.encrypt(arr[0], password));
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后将对应publickey和password放在配置文件的对应位置。
使用properties进行配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
# 加密后的密码(原密码 123456)
spring.datasource.password=WVMjPhfXQrIsWRo0/RCqAVvYtTU9WNVToKJohb8AlUmHwnV6vwFL+FM2CNFDMJwGHW1iCmyaUlF+sgvFdogqEA==
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 公钥
publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIiwHpFrDijV+GzwRTzWJk8D3j3jFfhsMFJ/7k1NTvBuLgL+TdIHgaMNOIEjHpXzuvX38J3FtOK8hLrySncVGOMCAwEAAQ==
# 配置 connection-properties,启用加密,配置公钥。
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${publickey}
# 启动ConfigFilter
spring.datasource.druid.filter.config.enabled=true
或者使用yml配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
sql-script-encoding: utf-8
driverClassName: com.mysql.jdbc.Driver
druid:
url: jdbc:mysql://47.106.188.177:3306/rs_new?useUnicode=true&characterEncoding=utf8&useServerPstmts=true&cachePrepStmts=true&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&cacheCallableStmts=true&connectTimeout=1000&maxReconnects=5&zeroDateTimeBehavior=convertToNull&useSSL=true
username: root
password: dm/EBMW25AZuDlvuyJe4HIaEVgiFCVRXvBSxwC9c4TUbPRP0YnuADJZvN6YuzEcmj4STFt6EHnBWH16qRHmPpg==
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJIMmD5aAT19WqTrqF5LXWP+dDOy8kuRDWmXBdmJgz+m2AbMSIixrj/t4rnOFl8GM4hYTvX1ATvDp/9M9LtvUXUCAwEAAQ==
connection-properties: config.decrypt=true;config.decrypt.key=${publickey}
# 初始连接数
initialSize: 10
# 最大连接池数量
maxActive: 50
# 最小连接池数量
minIdle: 10
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
url-pattern: /monitor/druid/*
filter:
config:
enabled: true
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: false
wall:
config:
multi-statement-allow: true
log4j:
statement-logger-name: