数据库如何加密连接
文章目录
1. 前言
现在无论是公司的项目还是个人的项目,都会选择将源码托管在Git服务器(Gitee,CODING,云效),只要将源码提交到公网服务器就会存在源码泄露的风险,数据库配置信息作为源码的一部分,一旦出现泄露问题,其产生的损失是无法估量的。
为了避免上述问题的产生,最好对数据库的密码进行加密操作,即使生产环境配置文件源码遭到泄露,也不会造成数据库数据的泄露。
2. 如何加密?
要想快速实现数据库的加密,最简单可行的方案就是使用阿里巴巴提供的Druid来实现加密。
Druid(中文译为“德鲁伊”)是阿里巴巴开源的一款 Java 语言中最好的数据库连接池。Druid 提供了强大的监控和扩展功能,当然也包含了数据库的加密功能。
Druid 开源地址:跳转链接
3. 使用Druid实现加密
添加Druid依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
4. 生成密文
借助 Druid 中提供的 ConfigTools
类来加密密码了,实现代码如下:
public static void main(String[] args) throws Exception {
// 需要加密的明文密码
String password = "1qazzaq1";
// 调用 druid 生成私钥、公钥、密文
ConfigTools.main(new String[]{password});
}
运行结果如下:
privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAhBSg+SVu4cEDnatvJH2vNfeHk1xtKuD5c+z6cf0qkqOk0wapWqs1H3HCutQvM9PbG2LLspqzfwE4lIi+/F7xpQIDAQABAkBoBdMtxfSJKjmN0PnstGvsxfFp9q4nyh3M1kP8yJXh/IRRxvnSo+619Jt540cjnezJbzE/Qa9nOPA0zXg61p2hAiEA6NEX6P4V0qa8Pe8Pc9Nb4ijThtsIaHUkoFS9Z904KJ0CIQCRO5gBq1JRB0lsOQEaO8aWlT8ASRd3JDnuWP3e3q4KqQIhAL+Tj0FCE2MLoMq19NkyiuFHBwhpJDoQatsj39efyZ5hAiAenDXknCxkYanLApTF57VqhZhawg0NEniXUPBpKfv6yQIgYdA40Q3wv+bsIA2sV06Ucm0lQhoWSaaClpKZl6tjSCY=
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIQUoPklbuHBA52rbyR9rzX3h5NcbSrg+XPs+nH9KpKjpNMGqVqrNR9xwrrULzPT2xtiy7Kas38BOJSIvvxe8aUCAwEAAQ==
password:DwuAm/Jwvq03JKojJL15G7xp0iPktV4N02uptlnvJgt3WEZdoXjejWnebpFMcKn1z1dNk1Q/Miwo7ICrJgaVpw==
使用 ConfigTools
类会生成 3 部分的内容:
- privateKey:私钥,暂时不会用到,用于密码的加密;
- publicKey:公钥,用于密码的解密;
- password:加密之后的密码。
5. 添加加密配置
把生成的公钥和密文添加到项目的配置文件中
spring:
# MySQL 配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false
username: root
password: PUz+7JCeI1mvHG3q4FBtOkjBp9WSNaptqQtpAEhHKSjHTbcN/4dALkNnY9lmcdTBekepmidkZ/VwNtUnfZ0k1Q==
# encrypt config
filters: config
connect-properties:
config.decrypt: true
config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJIavWOrjPYNSTkSeUmiCSbAvPHjv2LI9Ow3rTrg9gHuYGpiccvLpYLZhvTNW26XNOSNP+fsKFMnBYXcB/IVa0UCAwEAAQ==
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
其中 password
对应的是上一步生成的 password
(密文),而 config.decrypt.key
对应的是上一步生成的 publicKey
(公钥)。
原始的配置文件,和加密后的配置文件进行比对:
6. 隐藏问题
通过上面的配置已经完成了加密功能,目前把密文和公钥都放在了配置文件中,这时就会导致源码泄露后 有人拿到密文和公钥之后,就可以使用Druid将加密的密码还原出来,这就相当于还是把钥匙和锁放在了一起,还是不安全。
正确的使用方式:把公钥放在一个安全的地方保存起来,启动项目时动态的将公钥读取设置到项目中,这样就可以有效的保证密码的安全。
正确的配置文件:
spring:
# MySQL 配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://43.138.50.206:3306/testdb?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false
username: root
password: PUz+7JCeI1mvHG3q4FBtOkjBp9WSNaptqQtpAEhHKSjHTbcN/4dALkNnY9lmcdTBekepmidkZ/VwNtUnfZ0k1Q==
# encrypt config
filters: config
connect-properties:
config.decrypt: true
config.decrypt.key: ${spring.datasource.druid.publickey}
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
公钥被修改为:${spring.datasource.druid.publickey}
,使用占位符方式,等项目启动时才知道具体的值是什么
ps:${spring.datasource.druid.publickey} key随便设置都可以,要保证和启动参数一致
7. 开发环境替换公钥
在 idea 的启动参数中配置公钥的值即可,如下图所示:
公钥配置正确时可以正常启动,错误时会提示解密失败:
8. 生产环境替换公钥
生产环境在启动 jar 包时只需要动态设置公钥的值即可,参考以下命令:
java -jar xxx.jar --spring.datasource.druid.publickey=你的公钥
9. 运行原理
当 Spring Boot 项目启动时,Druid 的拦截器会使用密文和公钥将密码还原成真实的密码以供项目使用,当然这一切都无需人工干预(无需编写任何代码),Druid 已经封装好了,我们只需要通过以上配置即可。
那怎么通过密文和公钥还原真实密码呢?
ConfigTools
类中已经提供了相应实现,代码如下:
// 公钥
String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJIavWOrjPYNSTkSeUmiCSbAvPHjv2LI9Ow3rTrg9gHuYGpiccvLpYLZhvTNW26XNOSNP+fsKFMnBYXcB/IVa0UCAwEAAQ==";
// 密文
String password = "PUz+7JCeI1mvHG3q4FBtOkjBp9WSNaptqQtpAEhHKSjHTbcN/4dALkNnY9lmcdTBekepmidkZ/VwNtUnfZ0k1Q==";
String decrypt = ConfigTools.decrypt(publicKey, password);
System.out.println(decrypt);
10. 总结
通过阿里巴巴开源的 Druid 实现 MySQL 的密码加密,Druid 的加密过程无需编写任何代码,只需要添加 Druid 依赖,再通过 Druid 的工具类生成密文,最后将密文配置到 application.yml
文件即可。项目在运行时会通过拦截器将密文转换成真正的密码,从而实现了 MySQL 密码的加密和解码的过程。
相关文章
- MacOS多连接数据库管理工具-Navicat Premium 16 for Mac汉化免安装版
- Oracle中sys、system和Scott用户下的数据库连接问题
- MySQL触发器简单实例详解数据库
- 数据库开启全球访问:连接MYSQL数据库的外网IP指南(外网ip连接mysql)
- MySQL Status Handler_read_prev 数据库状态作用意思及如何正确
- MySQL数据库:解锁命令指南(mysql数据库解锁命令)
- 优化Oracle内存数据库性能(oracle内存数据库)
- 批量导入Oracle数据库表(oracle批量导入表)
- Oracle数据库优化:内存分配策略(oracle内存分配内存)
- 使用PDO连接Oracle数据库(pdo连接oracle)
- Redis:高性能分布式键值对内存存储数据库(redis是干什么的)
- 使用Qt快速连接MySQL数据库(qt连接mysql)
- Oracle触发器类型:让你掌握数据库管理技术(oracle触发器类型)
- 快速上手:Java连接Mongodb数据库(java连接mongodb数据库)
- 深入浅出neo4j:学习图数据库的最佳入门读物(neo4j书)
- MySQL句柄:数据库连接必备技能(mysql句柄)
- 快速使用JDBC连接SQL Server数据库(jdbc连接sqlserver数据库)
- Connecting to MySQL: The Essential Guide to Database Connectivity(mysql数据库连接)
- 使用 PyQT 连接并操作 MySQL 数据库(pyqt 连接mysql)
- MSSQL数据库通过加密技术保护连接字符串(mssql连接字符串加密)
- 优化MSSQL数据库架构:策略与实践(mssql架构怎么修改)
- 解决MSSQL连接数据库失败的技巧(连接mssql数据库失败)
- 驱动cnd程序实现MySQL数据库连接(cnd 输入mysql)
- AMH管理面板修改MySQL文件实现数据库优化(amh修改mysql文件)
- Windows命令行连接MySQL数据库(cmd中链接mysql)
- cxoracle一款非常安全的数据库连接工具(cx_oracle是什么)
- CMD终端快捷启动Oracle数据库(cmd 启用oracle)
- MySQL不再让自增约束束缚你的数据库设计(mysql 不使用自增)