专栏名称: 架构师社区
架构师小秘圈,聚集10万架构师的小圈子!不定期分享技术干货,行业秘闻,汇集各类奇妙好玩的话题和流行动向!禁止截图,阅后即焚!
目录
相关文章推荐
参考消息  ·  俄乌正在谈“全部换全部” ·  昨天  
参考消息  ·  特朗普宣布换人! ·  2 天前  
卢克文工作室  ·  上千元德国剃须刀平替,居然只要百元?!min ... ·  2 天前  
参考消息  ·  国产载人飞艇成功首飞! ·  2 天前  
参考消息  ·  克宫为特朗普“帮腔” ·  3 天前  
51好读  ›  专栏  ›  架构师社区

阿里巴巴Druid,轻松实现MySQL数据库加密!

架构师社区  · 公众号  ·  · 2021-03-06 11:23

正文

作者 | 王磊

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

为什么要加密?

现在的开发习惯,无论是公司的项目还是个人的项目,都会选择将源码上传到 Git 服务器(GitHub、Gitee 或是自建服务器),但只要 将源码提交到公网服务器就会存在源码泄漏的风险 ,而数据库配置信息作为源码的一部分,一旦出现源码泄漏,那么数据库中的所有数据都会公之于众,其产生的不良后果无法预期(比如某某酒店的信息)。

于是 为了避免这种问题的产生,我们至少要对数据库的密码进行加密操作 ,这样即使得到了源码,也不会造成数据的泄露,也算保住了最后一块遮羞布。

如何加密?

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

什么是Druid?

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

Druid 开源地址:https://github.com/alibaba/druid/

Druid可以做什么?

  1. Druid 可以监控数据库访问性能,Druid 内置提供了一个功能强大的 StatFilter 插件,能够详细统计 SQL 的执行性能,这对于线上分析数据库访问性能有帮助。
  2. 替换数据库连接池 DBCP 和 C3P0,Druid 提供了一个高效、功能强大、可扩展性好的数据库连接池。
  3. 数据库密码加密,直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver 和 DruidDataSource 都支持 PasswordCallback。
  4. SQL 执行日志,Druid 提供了不同的 LogFilter,能够支持 Common-Logging、Log4j 和 JdkLog,你可以按需要选择相应的 LogFilter,监控你应用的数据库访问情况。
  5. 扩展 JDBC,如果你要对 JDBC 层有编程的需求,可以通过 Druid 提供的 Filter-Chain 机制,很方便编写 JDBC 层的扩展插件。

对于本文来说,我们重点来看它的第 3 个特性,也就是使用 Druid 来实现数据库密码加密。

加密执行流程

在没有进行密码加密之前,项目的交互流程是这样的:

在使用了密码加密之后,项目的交互流程就变成了这样:

使用Druid实现加密

本示例运行环境:

Spring Boot 2.4.3

MySQL 5.7

Java 1.8

Idea 2020.1.3

1.添加Druid依赖

Maven 项目:

<dependency>
   <groupId>com.alibabagroupId>
   <artifactId>druid-spring-boot-starterartifactId>
   <version>1.2.5version>
dependency>

Gradle 项目:

compile 'com.alibaba:druid-spring-boot-starter:1.2.5'

获取 Druid 最新版本:https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter

2.生成密文

Druid 添加完成之后就可以借助 Druid 中提供的 ConfigTools 类来加密密码了,实现代码如下:

import com.alibaba.druid.filter.config.ConfigTools;

class MyTests {
    public static void main(String[] args) throws Exception {
        // 需要加密的明文命名
        String password = "youPassword"// 【注意:这里要改为你自己的密码】
        // 调用 druid 生成私钥、公钥、密文
        ConfigTools.main(new String[]{password});
    }
}

以上代码执行的结果如下:

privateKey:MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEApOjcMWSDzJiKVGmtcBBoQPtM9tVW2H2cnS6xZK7NrbzQXYWLQD2zefIrrx9vMvqRIHEqkmAHTuUcUXHgCxu0cwIDAQABAkAlqo5ItdWo0Jqf5zdXJlg5p2yP4HCiqCYyfKzF+2s9KEmgWZJWTctZDsgQ0iYUohORR59I+J4nabhel1x5/INpAiEA6jwSyFqMUPOh1XlrzNFek+RthOQ5n4+ALPo+vULayO0CIQC0O7JM9sIq+tg+jCGv+ypk6vbuRKY9m5W2rSRXapGm3wIgRHul3jAjIDPrF/f1HaAFL+Y0Yws7Ebyp8/yCRWF7iA0CIALbe20q8FMcHPeI4zPWCIsHCpkmb3hEkjAOOKhGIT8DAiAqiUuz92NqKeyjmOfons1ka65EzVwA3NDhZ6+IQcnuig== publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKTo3DFkg8yYilRprXAQaED7TPbVVth9nJ0usWSuza280F2Fi0A9s3nyK68fbzL6kSBxKpJgB07lHFFx4AsbtHMCAwEAAQ== password:IMgKm27bOHok3/+5aDL4jGBoVVZkpicbbM6pIXQppi3dI7h3jngSAqhqwqYnfuYpyVJ0k++q9xWWnHtd6sAWnQ==







请到「今天看啥」查看全文