数据库如何加密连接_数据库连接加密

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

1. 前言

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

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

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 部分的内容

  1. privateKey私钥暂时不会用到用于密码的加密
  2. publicKey公钥用于密码的解密
  3. 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 密码的加密和解码的过程。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 数据库