前言
在项目中,我们一般是将数据库的连接信息(账号密码等)明文写在配置文件中,这样会有一个问题,我们很容易就把数据库的账号密码暴露出去了,因为yml文件在打成jar包后不会进行编译,还是一个yml文件,只要这个yml文件不小心泄露,我们数据库的连接信息就暴露了,下面我们来针对问题研究一下,看有没有什么加密的方式
先来看不对密码进行加密的配置
datasource:
name: druidDataSource
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://ip:port/db?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
# 明文密码
password: yourpasswd
# 其它配置略................
这样直接配置的明文,显得不太安全
然后得知 Druid 有自带的有加密方式,通过自带的jar包可以生成密钥,我们来试一下
Druid加密方式
先去自己的Maven仓库中找到Druid的jar包,我这里是1.2.5版本,其它版本应该也可以,然后打开命令行(cmd或者bash)定位到jar包所在的路径,执行如下命令(Aa123456 为原始数据库密码)
java -cp druid-1.2.5.jar com.alibaba.druid.filter.config.ConfigTools Aa123456
生成了privateKey、publicKey、加密后的password
privateKey:MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAtpgI1KFA4e/n/nLmUFgn70dEso/e3tq+wX49ek9pWFFGhogFmb7jDUyguSQ+Rvgt0txo7z2OdCRe9m4spzjGRwIDAQABAkBjfr65FlEjjDVvCi8DsrW4Ba6iWhEIgEuXZfGb9y+hBmTiEhWSW1UffdPD0ROTo9jg0suhNTxFcboPMF2GOdIBAiEA3gtH0jlMdi32fFCPkywh9oDzy6m5PAutrHpKEOBGm0cCIQDShFVt/eDraF2jiGzQooH+th8mdx/+OpHmDo7Q6Rv9AQIhANxlwA1n+IBZkQ7F/C0uIiwGxXcDaayzPtkzrS7hHtRjAiA+LaIB+9OcFFZb/+aL9QPKVMZ8mQDVGT2QosoiAEgpAQIhAIVq9yXbojHrW3G1cUsA1EkZ60pWjRgOrJrqbKXsULo4
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALaYCNShQOHv5/5y5lBYJ+9HRLKP3t7avsF+PXpPaVhRRoaIBZm+4w1MoLkkPkb4LdLcaO89jnQkXvZuLKc4xkcCAwEAAQ==
password:QQ446Ed787nuj8CClXEQ+zWqLQJF+d7cQsGmRQSTF+++fXR5flrzQXGHPjewAS1/OHUpKUb+82MYD0Mj6+K2yg==
更新yml中数据的密码为加密数据
其中password为上一步中生成的加密password,key为上一步生成的publicKey
datasource:
name: druidDataSource
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://ip:port/db?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
# 这里填上面获取到的password
password: QQ446Ed787nuj8CClXEQ+zWqLQJF+d7cQsGmRQSTF+++fXR5flrzQXGHPjewAS1/OHUpKUb+82MYD0Mj6+K2yg==
# 这里填上上面获取到的publicKey
key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALaYCNShQOHv5/5y5lBYJ+9HRLKP3t7avsF+PXpPaVhRRoaIBZm+4w1MoLkkPkb4LdLcaO89jnQkXvZuLKc4xkcCAwEAAQ==
# config.decrypt=true 设定启动解密, config.decrypt.key=${spring.datasource.druid.key} 表示使用上一行配置的公钥来解密
connection-properties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=${spring.datasource.druid.key}"
initial-size: 1
max-active: 20
filters<