数据库如何加密连接

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 数据库如何加密连接

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>


查看Druiid最新版本


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(公钥)。


原始的配置文件,和加密后的配置文件进行比对:

1673459244192.jpg


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 的启动参数中配置公钥的值即可,如下图所示:

1673459264940.jpg

公钥配置正确时可以正常启动,错误时会提示解密失败:

1673459273305.jpg


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 密码的加密和解码的过程。

相关文章
|
1月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
145 3
|
19天前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
116 68
|
14天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
30 3
|
21天前
|
关系型数据库 MySQL 数据库连接
DBeaver如何连接一个数据库
【10月更文挑战第27天】DBeaver 是一款功能强大的通用数据库管理工具,支持多种主流数据库。本文介绍了使用 DBeaver 连接数据库的基本步骤,包括下载安装、创建新连接、选择数据库类型、配置连接参数、测试连接以及最终连接到数据库。详细的操作指南帮助用户轻松管理和操作数据库。
105 9
|
14天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
14天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
31 1
|
23天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
57 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
17天前
|
SQL 关系型数据库 数据库连接
"Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
41 0
|
1月前
|
SQL 存储 监控
串口调试助手连接SQL数据库的技巧与方法
串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析