首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据库如何加密连接

数据库如何加密连接

作者头像
鱼找水需要时间
发布于 2023-02-16 12:14:43
发布于 2023-02-16 12:14:43
2.8K00
代码可运行
举报
文章被收录于专栏:SpringBoot教程SpringBoot教程
运行总次数:0
代码可运行

文章目录

1. 前言

现在无论是公司的项目还是个人的项目,都会选择将源码托管在Git服务器(Gitee,CODING,云效),只要将源码提交到公网服务器就会存在源码泄露的风险,数据库配置信息作为源码的一部分,一旦出现泄露问题,其产生的损失是无法估量的。

为了避免上述问题的产生,最好对数据库的密码进行加密操作,即使生产环境配置文件源码遭到泄露,也不会造成数据库数据的泄露。

2. 如何加密?

要想快速实现数据库的加密,最简单可行的方案就是使用阿里巴巴提供的Druid来实现加密。

Druid(中文译为“德鲁伊”)是阿里巴巴开源的一款 Java 语言中最好的数据库连接池。Druid 提供了强大的监控和扩展功能,当然也包含了数据库的加密功能。

Druid 开源地址:跳转链接

3. 使用Druid实现加密

添加Druid依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

查看Druiid最新版本

4. 生成密文

借助 Druid 中提供的 ConfigTools 类来加密密码了,实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws Exception {
    // 需要加密的明文密码
    String password = "1qazzaq1";
    // 调用 druid 生成私钥、公钥、密文
    ConfigTools.main(new String[]{password});
}

运行结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAhBSg+SVu4cEDnatvJH2vNfeHk1xtKuD5c+z6cf0qkqOk0wapWqs1H3HCutQvM9PbG2LLspqzfwE4lIi+/F7xpQIDAQABAkBoBdMtxfSJKjmN0PnstGvsxfFp9q4nyh3M1kP8yJXh/IRRxvnSo+619Jt540cjnezJbzE/Qa9nOPA0zXg61p2hAiEA6NEX6P4V0qa8Pe8Pc9Nb4ijThtsIaHUkoFS9Z904KJ0CIQCRO5gBq1JRB0lsOQEaO8aWlT8ASRd3JDnuWP3e3q4KqQIhAL+Tj0FCE2MLoMq19NkyiuFHBwhpJDoQatsj39efyZ5hAiAenDXknCxkYanLApTF57VqhZhawg0NEniXUPBpKfv6yQIgYdA40Q3wv+bsIA2sV06Ucm0lQhoWSaaClpKZl6tjSCY=
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIQUoPklbuHBA52rbyR9rzX3h5NcbSrg+XPs+nH9KpKjpNMGqVqrNR9xwrrULzPT2xtiy7Kas38BOJSIvvxe8aUCAwEAAQ==
password:DwuAm/Jwvq03JKojJL15G7xp0iPktV4N02uptlnvJgt3WEZdoXjejWnebpFMcKn1z1dNk1Q/Miwo7ICrJgaVpw==

使用 ConfigTools 类会生成 3 部分的内容:

  1. privateKey:私钥,暂时不会用到,用于密码的加密;
  2. publicKey:公钥,用于密码的解密;
  3. password:加密之后的密码。

5. 添加加密配置

把生成的公钥和密文添加到项目的配置文件中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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将加密的密码还原出来,这就相当于还是把钥匙和锁放在了一起,还是不安全。

正确的使用方式:把公钥放在一个安全的地方保存起来,启动项目时动态的将公钥读取设置到项目中,这样就可以有效的保证密码的安全。

正确的配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 包时只需要动态设置公钥的值即可,参考以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar xxx.jar --spring.datasource.druid.publickey=你的公钥

9. 运行原理

Spring Boot 项目启动时,Druid 的拦截器会使用密文和公钥将密码还原成真实的密码以供项目使用,当然这一切都无需人工干预(无需编写任何代码),Druid 已经封装好了,我们只需要通过以上配置即可。

那怎么通过密文和公钥还原真实密码呢? ConfigTools 类中已经提供了相应实现,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 公钥
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 密码的加密和解码的过程。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
巧用Druid数据源实现数据库连接密码的加密解密
一个系统的数据库的连接密码作为一个非常重要的安全数据,其安全非常重要。而在代码的配置文件中直接存放明文密码提交到代码仓库后显然有泄露的风险。
用户3587585
2022/04/14
5.7K0
巧用Druid数据源实现数据库连接密码的加密解密
springboot之druid数据库密码加密实战
最近接了一个外包单(基于springboot2,连接池为druid),客户经费有限,基本上要啥,啥没有,项目基本上是托管在私人的某gay,某云等,本着让客户放心的原则,就在安全方面多考虑了一点,首先比如数据库密码加密之类的,虽然要是有心要破解也是容易,但至少加密给自己心里一点暗示。。。废话有点多,进入正题,本文主要分为3个部分,第一部分是单个数据源密码加密,第二部分是多个数据源密码加密,第三部分是简要的解密源码分析。
lyb-geek
2022/03/10
1.9K0
springboot之druid数据库密码加密实战
Druid实现数据库连接用户密码加密
一、Druid号称是Java语言中最好的数据库连接池。 1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。 4) SQL执行日
小柒2012
2018/04/13
7.5K0
Druid实现数据库连接用户密码加密
项目中如何对数据库和redis进行加解密处理?
由于项目的需求要求对数据的账号密码和redis的密码进行加密处理,但又不知道用什么加密的方法,有一些加密的方式很容易破解,正在苦恼的时候问了一下其他的同事只要是加密的不那么一眼看出来就行,心想这是什么心态啊!也是醉了,那既然这样就先按这样做吧!
技术从心
2019/08/06
5K0
项目中如何对数据库和redis进行加解密处理?
聊聊springboot项目数据库密码如何加密
在我们日常开发中,我们可能很随意把数据库密码直接明文暴露在配置文件中,在开发环境可以这么做,但是在生产环境,是相当不建议这么做,毕竟安全无小事,谁也不知道哪天密码就莫名其妙泄露了。今天就来聊聊在springboot项目中如何对数据库密码进行加密
lyb-geek
2021/07/06
2.3K0
聊聊springboot项目数据库密码如何加密
聊聊springboot项目数据库密码如何加密
在我们日常开发中,我们可能很随意把数据库密码直接明文暴露在配置文件中,在开发环境可以这么做,但是在生产环境,是相当不建议这么做,毕竟安全无小事,谁也不知道哪天密码就莫名其妙泄露了。今天就来聊聊在springboot项目中如何对数据库密码进行加密
lyb-geek
2022/01/07
3K0
聊聊springboot项目数据库密码如何加密
MySQL连接配置文件密码加密及其在多种连接池上的应用
将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行初始化连接池的时候进行解密操作,达到成功创建连接池的目的。
孟君
2019/09/10
4.2K0
Druid 加密配置
一般来说, 链接数据库的密码是明文存放的, 这样不安全, 任意获取到密码配置的人都可以获取到数据库的连接密码, 导致不安全的产生. druid有密码加密功能, 可以解决这个问题. druid使用rsa加密方式进行密码保护.(并不规范: 在后续问题中会讲)
全栈程序员站长
2022/09/15
3.3K0
springboot druid数据库密码加密
其中:publicKey 为公钥 , password为加密后密码,privateKey为私钥
六月的雨在Tencent
2024/03/28
5210
springboot druid数据库密码加密
Druid数据库连接池 实现数据库账号密码加密
jar包版本:druid-1.0.15.jar 1. 加密,用以下命令将用户名和密码加密 cmd命令行执行 java -cp druid-1.0.15.jar com.alibaba.druid.filter.config.ConfigTools 加密串 得到密文 2.用户名解密: package com.heli.core.user.common; import com.alibaba.druid.filter.config.ConfigTools; import com.alibaba.druid.po
冷冷
2018/02/08
3.1K0
SpringBoot集成Druid连接池
https://www.cnblogs.com/noneplus/p/11528129.html
Noneplus
2019/09/24
1.1K0
SpringBoot集成Druid连接池
使用durid的ConfigFilter对数据库密码加密
哎_小羊
2018/01/02
2.3K0
项目中数据库密码没有加密导致了数据泄露!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2021/03/09
7960
如何有效预防脱库
本篇不从DBA、网络架构层面来讲述数据安全,这部分有很专业的架构和云上产品来解决,本篇重点从开发人员角度讲述如何避免数据安全的漏洞。
BUG弄潮儿
2022/03/08
5350
你的数据库密码还在裸奔吗?试一试Druid数据库密码加解密吧!
1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
Java后端技术
2018/08/09
1.9K0
你的数据库密码还在裸奔吗?试一试Druid数据库密码加解密吧!
Jasypt : 整合spring boot加密应用配置文件敏感信息
背景 我们的应用之前使用的是Druid数据库连接池,由于需求我们迁移到HikariCP连接池,druid 数据源加密提供了多种方式: 可以在配置文件my.properties中指定config.decrypt=true 也可以在DruidDataSource的ConnectionProperties中指定config.decrypt=true 也可以在jvm启动参数中指定-Ddruid.config.decrypt=true 但是HikariCP 默认没有提供实现数据源加解密的方法 应用中会存在多个需要配
冷冷
2018/02/08
1.9K0
Druid 介绍及配置「建议收藏」
转自阿里Druid官方,欢迎大家使用Druid,常见问题在这里解答,希望对大家有所帮助。
全栈程序员站长
2022/09/15
3.4K0
Java 中如何加密配置文件中的数据库账号和密码?
作为程序员每天的开发工作都离不开跟数据库打交道,而且我们的应用程序往往都会配置数据库的链接,那你有没有想过,任何一个能接触到我们项目代码的人员,都可以看到配置文件里面的账号秘密?
Java极客技术
2022/12/04
2.7K0
Java 中如何加密配置文件中的数据库账号和密码?
CAS单点登录之支持数据库认证
在CAS.war里找到WEB-INF下面的cas.properties,这是cas的配置文件,可以自己加上一些配置:
SmileNicky
2019/06/11
1.2K0
SpringBoot项目application配置文件数据库密码上传git暴露问题解决方案
项目中含有配置文件,配置文件中含有数据库的用户名和密码,上传git直接对外网开放。那后果会怎样可想而知。
九转成圣
2024/04/10
2000
SpringBoot项目application配置文件数据库密码上传git暴露问题解决方案
推荐阅读
相关推荐
巧用Druid数据源实现数据库连接密码的加密解密
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验