Druid连接池实现数据库加密

这篇具有很好参考价值的文章主要介绍了Druid连接池实现数据库加密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

druid数据库密码加密,数据库,SpringBoot,数据库,系统安全,Powered by 金山文档

前言

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

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

怎么实现加密?

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

Druid基本介绍

Druid 是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和 SQL 解析器组成,该项目主要是为了扩展 JDBC 的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计 SQL 信息、SQL 性能收集、SQL 注入检查、SQL 翻译等,程序员可以通过定制来实现自己需要的功能。

Druid 是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括 DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。除此以外,Druid 提供了强大的监控和扩展功能,当然也包含了数据库的加密功能。

Druid 已经在阿里巴巴部署了超过 600 个应用,经过了很多生产环境大规模部署的严苛考验。

同时 Druid 不仅仅是一个数据库连接池,它包括四个部分:

Druid 是一个 JDBC 组件,它包括三个部分:

  • 基于 Filter-Chain 模式的插件体系。

  • DruidDataSource 高效可管理的数据库连接池。

  • SQLParser

Druid开源地址

Druid的功能点
  1. Druid 可以监控数据库访问性能,Druid 内置提供了一个功能强大的 StatFilter 插件,能够详细统计 SQL 的执行性能,这对于线上分析数据库访问性能有帮助。

  1. 替换数据库连接池 DBCP 和 C3P0,Druid 提供了一个高效、功能强大、可扩展性好的数据库连接池。

  1. 数据库密码加密,直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver 和 DruidDataSource 都支持 PasswordCallback。

  1. SQL 执行日志,Druid 提供了不同的 LogFilter,能够支持 Common-Logging、Log4j 和 JdkLog,你可以按需要选择相应的 LogFilter,监控你应用的数据库访问情况。

  1. 扩展 JDBC,如果我们要对 JDBC 层有编程的需求,可以通过 Druid 提供的 Filter-Chain 机制,很方便编写 JDBC 层的扩展插件。

在这里我们仅需要通过它来对配置文件中的数据库密码进行加密。

加密执行流程

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

druid数据库密码加密,数据库,SpringBoot,数据库,系统安全,Powered by 金山文档

在使用了密码加密之后,项目的交互流程:

druid数据库密码加密,数据库,SpringBoot,数据库,系统安全,Powered by 金山文档

Druid实现数据库加密过程

1,添加Druid依赖

这里以SpringBoot项目为例,引入SpringBoot的集成依赖:

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.2.14</version>
            </dependency>
2,调用工具类生成密文

借助Druid中的ConfigTools工具类来加密数据库对应的密码:

    @Test
    void method2() throws Exception {
        //定义数据库密码,以123456为例
        String password = "123456";
        //调用druid的工具类来加密密码
        ConfigTools.main(new String[]{password});
    }

执行后即可得到如下结果:

privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEAv5WmBXjC7ysGEz5455YGNiqf52HFTmF/+4efK1bxrXPGNt3idKYXapO3RktjATl2KQhVQo9v9JR98sC8ROrHCQIDAQABAkAtZh7jaQx4dG+KG+G2rzxllZAy2l5RBpW3WxoCwSWf/kfIyNjaNTEQXZAF9a+9JSaII3c8x6+K3vQccVyzoB8BAiEA9nVYs4lJqa4kczuG8J9jgy9LX9UK2vuZKUzMJ/BQ9zkCIQDHAHJU0NIa5McWWwziKhq6BI1Dfje6Jt2cIkFPpBL+UQIhAIkBkt27ZAe/luO4I7t/34H9uJj9hZtWYj5jQtqw7VGBAiEAtTnn5OvC23ELCYXjpreXXV4104hHccRhPwZHGiMelPECIQDp0g+5HMxLTI3EWuHlAOOZfiwCZy0S+uexT2xXGUL/wg==
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL+VpgV4wu8rBhM+eOeWBjYqn+dhxU5hf/uHnytW8a1zxjbd4nSmF2qTt0ZLYwE5dikIVUKPb/SUffLAvETqxwkCAwEAAQ==
password:daOJOrMQgK7yxCkUW7FRhSmdDFZIqgMmmXfRw5FM/zsNM08Tgdu+I9I/bJ3akSf4w/fV0IjY/qjDE3jBw20tAA==

可以看到执行结果包含3个部分的内容:

  1. privateKey:私钥,暂时不会用到,用于密码的加密;

  1. publicKey:公钥,用于密码的解密;

  1. password:密文,加密之后的密码。

这里我们主要通过publicKey和password来实现对数据库的加密,将明文密码转换为密文。

3,添加到yml配置文件

得到执行结果后,我们需要将公钥和密文分别添加到项目的yml配置文件中

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://localhost:3306/store_user?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
      username: root
      #生成后的密文
      password: daOJOrMQgK7yxCkUW7FRhSmdDFZIqgMmmXfRw5FM/zsNM08Tgdu+I9I/bJ3akSf4w/fV0IjY/qjDE3jBw20tAA==
      filters: config
      connect-properties:
        config.decrypt: true
      #生成的公钥
        config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL+VpgV4wu8rBhM+eOeWBjYqn+dhxU5hf/uHnytW8a1zxjbd4nSmF2qTt0ZLYwE5dikIVUKPb/SUffLAvETqxwkCAwEAAQ==
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true
    auto-mapping-behavior: full
    lazy-loading-enabled: true
    aggressive-lazy-loading: false
  type-aliases-package: com.yy.pojo #设置别名
注意:但是这样并不完全安全,当我们将密文和公钥都写入配置文件,这就会造成当有人拿到密文和公钥之后,就可以使用 Druid 将加密的密码还原出来了,这就好比一把插着钥匙的锁是极不安全的。

因此我们正确的使用方式是将公钥找一个安全的地方保存起来,每次在项目启动时动态的将公钥设置到项目中,这样就可以有效的保证密码的安全了。,

4,优化yml配置文件

接下来我们将 Spring Boot 的公钥设置为配置项,在项目运行时再替换为具体的值,最终的安全配置信息如下:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://localhost:3306/store_user?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
      username: root
      #生成后的密文
      password: daOJOrMQgK7yxCkUW7FRhSmdDFZIqgMmmXfRw5FM/zsNM08Tgdu+I9I/bJ3akSf4w/fV0IjY/qjDE3jBw20tAA==
      filters: config
      connect-properties:
        config.decrypt: true
      #生成的公钥
        config.decrypt.key: ${spring.datasource.druid.publicKey}

这里为了保证安全,我们可以将公钥被修改成“${spring.datasource.druid.publickey}”,这就相当于使用占位符去替代公钥,等项目启动时再更换上具体的值去执行。

注意:“spring.datasource.druid.publickey”并非是固定不可变的 key,此 key 值用户可自行定义。

启动测试

开发环境中只需要在 Idea 的启动参数中配置公钥的值即可,如下图所示:

druid数据库密码加密,数据库,SpringBoot,数据库,系统安全,Powered by 金山文档

当我们输入正确的公钥值时程序可以正常运行,当输入一个错误的公钥值时就会提示解码失败,如下图所示:

druid数据库密码加密,数据库,SpringBoot,数据库,系统安全,Powered by 金山文档

生产环境下启动时,我们可以动态的设置公钥的值即可。如下:

java -jar xxx.jar --spring.datasource.druid.publickey=公钥值

最后测试数据库操作,可以对数据库数据进行正常访问,加密操作成功。

druid数据库密码加密,数据库,SpringBoot,数据库,系统安全,Powered by 金山文档

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

后记

这里补充一句:上面提到了,我们不建议直接将公钥值填在yml文件中,因为会造成密码泄露的风险是有理可循的。这里我们通过Druid工具类做个还原操作即可证实这一点:

 @Test
    void method3() throws Exception {
        String publicKey="MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL+VpgV4wu8rBhM+eOeWBjYqn+dhxU5hf/uHnytW8a1zxjbd4nSmF2qTt0ZLYwE5dikIVUKPb/SUffLAvETqxwkCAwEAAQ==";
        String pwd="daOJOrMQgK7yxCkUW7FRhSmdDFZIqgMmmXfRw5FM/zsNM08Tgdu+I9I/bJ3akSf4w/fV0IjY/qjDE3jBw20tAA==";
        System.out.println(ConfigTools.decrypt(publicKey, pwd));
    }

这样就得到破译后的原密码了,这是很危险的。

druid数据库密码加密,数据库,SpringBoot,数据库,系统安全,Powered by 金山文档

所以,当公钥,密文全部显示配置后,密码源是能够被获取的,那么我们数据库加密就没有什么意义了。虽然通过配置启动参数或jar包启动配置相对直接运行会麻烦一点,但是安全性得到了基本保证,还是可以滴~文章来源地址https://www.toymoban.com/news/detail-636210.html

到了这里,关于Druid连接池实现数据库加密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库连接池(Druid(德鲁伊))

    在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤 在主程序(如servlet、beans)中建立数据库连接 进行sql操作 断开数据库连接   这种模式开发,存在的问题: 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection加载到内存

    2024年03月14日
    浏览(47)
  • 【八】spring boot集成数据库连接池druid

            最近在进行程序优化的过程中发现程序瓶颈在数据库连接这块,于是开始研究怎么对数据库连接池参数进行调优,在这个过程中发现很多人使用druid很不规范,经常会出现导入的包和配置参数不对应的情况,这些都是因为对集成druid一知半解导致的,因此决心写一

    2024年02月09日
    浏览(42)
  • SpringBoot整合(五)HikariCP、Druid数据库连接池—多数据源配置

    在项目中,数据库连接池基本是必不可少的组件。在目前数据库连接池的选型中,主要是 Druid ,为 监控 而生的数据库连接池。 HikariCP ,号称 性能 最好的数据库连接池。 在Spring Boot 2.X 版本,默认采用 HikariCP 连接池。而阿里大规模采用 Druid 。下面介绍在SpringBoot中使用Hika

    2024年02月17日
    浏览(59)
  • SpringBoot整合Druid数据库连接池&多数据源&注解切换&动态添加

    配置好之后 Druid 会通过 DruidDataSourceAutoConfigure 自动装配 属性配置 数据源枚举 动态数据源 继承 AbstractRoutingDataSource 就可以实现动态数据源了 实现了一个动态数据源类的构造方法,主要是为了设置默认数据源,以及以Map保存的各种目标数据源。其中Map的key是设置的数据源名称

    2024年03月22日
    浏览(49)
  • elastic-job-ui在使用druid作为数据库连接池时作业维度报错

    我们项目中使用到了elastic-job,然后自己封装了个sdk,方便使用,里面的数据源配置是常用的druid+mysql的组合,在操作中,发现elastic-job-ui可视化控制台会报错无法使用。 深究其原因是因为,各个服务把定时任务注册到了zk中,包括数据库配置类的一些信息,但是elastic-job-ui源

    2024年02月10日
    浏览(33)
  • 【数据库连接问题】Java项目启动时无限异常com.alibaba.druid.pool.DruidDataSource : create connection SQLException

    Java项目启动失败, ERROR:com.alibaba.druid.pool.DruidDataSource : create connection SQLException 在此之前这个SpringBoot项目中使用的是单一数据库读写策略。今天尝试使用读写分离策略,在 application.yml 配置文件中加入了以下读写分离相关内容后启动项目失败。 根据网上的解决方法,初步怀

    2024年02月16日
    浏览(32)
  • 物联网开发终端管理篇-java从MQTT获取设备数据,并通过Druid连接池把数据写入MySQL数据库(Windows系统)

    下面来给大家做个简单的数据对接,也就是通过写JAVA代码实现MQTT协议 首页我们得搭建一个简单的IDEA项目,这个我就不做演示了 搭建完项目,我们需要准备一些jar包,jar包名如下: org.eclipse.paho.client.mqttv3-1.1.0.jar mysql-connector-java-5.1.34.jar jackson-databind-2.10.0.jar jackson-core-2.10.0

    2024年02月11日
    浏览(37)
  • Spring Boot 数据库操作Druid和HikariDataSource

    目录 Spring Boot  数据库操作 应用实例-需求 创建测试数据库和表 进行数据库开发, 在pom.xml 引入data-jdbc starter 参考官方文档 需要在pom.xml 指定导入数据库驱动 在application.yml 配置操作数据源的信息 创建beanFurn.java 测试结果 整合Druid 到Spring-Boot  官方文档 Durid 基本使用 修改

    2024年02月06日
    浏览(86)
  • spring boot shardingsphere mybatis-plus druid mysql 搭建mysql数据库读写分离架构

    ##关于window mysql主从搭建简单教程 传送门 window mysql5.7 搭建主从同步环境-CSDN博客 ##父pom.xml ##模块pom.xml ##yml配置 ##mapper.xml ##TestMapper ##TestService ##TestController ##浏览器访问 ##数据库

    2024年01月21日
    浏览(52)
  • Druid作为数据源(连接池、过滤器、日志)

    name :数据源名称如果存在多个数据源,监控的时候可以通过名字来区分开来 如果没有配置,将会生成一个名字,格式是\\\"DataSource-\\\"+System.identityHashCode(this) jdbcUrl :连接数据库的 url,不同数据库不一样 username :连接数据库的用户名 password :连接数据库的密码 driverClassName :数

    2024年01月18日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包