Druid 加密配置

Druid 加密配置这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Ma…

大家好,又见面了,我是你们的朋友全栈君。

前言

一般来说, 链接数据库的密码是明文存放的, 这样不安全, 任意获取到密码配置的人都可以获取到数据库的连接密码, 导致不安全的产生. druid有密码加密功能, 可以解决这个问题. druid使用rsa加密方式进行密码保护.(并不规范: 在后续问题中会讲)

总结

要配置druid密钥,
a. 配置connectionProperties属性: config.decrypt=true;config.decrypt.key=公钥
b. spring.datasource.password设置用私钥加密后的密码
注意:

  1. 尽量不要用 druid自带的加密解密方式, 可以在 druid的自定义配置类里面加上自己的解密方法.
  2. 如果一定要用druid自带的rsa加密解密方式, 请不要用自带的默认公钥/私钥
  3. 另外druid自带的加密, 可以使用自定义”com.alibaba.druid.util.DruidPasswordCallback”, 来实现自己的加密解密实现.

具体步骤

1. 生产密钥

参考资料: 1. druid加密测试类

2. 环境配置

这里主要有1. 依赖配置. 2. 参数配置.

1. 依赖配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.1.4.RELEASE</version>
       <relativePath/>
       <!-- lookup parent from repository -->
   </parent>
   <groupId>com.example</groupId>
   <artifactId>spring-boot-mybitis-demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>war</packaging>
   <name>spring-boot-mybitis-demo</name>
   <description>Demo project for Spring Boot</description>

   <properties>
   	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
   	<java.version>1.8</java.version>
   	<!-- 数据源 -->
   	<druid>1.1.20</druid>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
   	<dependency>
   		<groupId>org.springframework.boot</groupId>
   		<artifactId>spring-boot-configuration-processor</artifactId>
   		<optional>true</optional>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework.boot</groupId>
   		<artifactId>spring-boot-devtools</artifactId>
   		<scope>runtime</scope>
   		<optional>true</optional>
   	</dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>

       <!-- Mysql 驱动-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <scope>runtime</scope>
       </dependency>
        <!-- H2 驱动-->
   	<dependency>
   		<groupId>com.h2database</groupId>
   		<artifactId>h2</artifactId>
   		<scope>runtime</scope>
   	</dependency>
		<!-- Druid 数据连接池依赖 -->
   	<dependency>
   		<groupId>com.alibaba</groupId>
   		<artifactId>druid</artifactId>
   		<version>${druid}</version>
   	</dependency>
   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>

</project>

2. druid和spring配置:

需要特别说明的是, 我导入的不是druid-starter, spring boot不会自动注入druid的配置, 需要写个druidconfig类进行配置.
这里有2个关注点:

  1. 配置中的属性spring.datasource.password
#spring配置
spring:
devtools:
  restart:
    enabled: true
#数据源配置
datasource:
  driverClassName: org.h2.Driver
  url: jdbc:h2:mem:manage_db_test
  username: sa
  password: g31I5n/mlZBjZ3exuGppj12e9ofGUsTas12Xel4v+QB4uL04NqShZRLo1JqSLE9AjjdHgip/4p83GfQYdlf7VaIuVqbueSwIGSpqJu4eI/DKwdO6PqM4SUGoTXbkl4rbEC5SoNgOSZC+jk2PtFW3lEKBHXAkVWnvDAidD9Znd+GNMb7uHOYxKQxPkWyKI1eYYjAn9r70VAX5JYpCnINhcLG1p6EgzI0jXZSzyw2BW3eVdgaDfSHAYqL0inxGcvheXW65LuPHNbNSM2tK2md6mmG1U8GhAvUF/to3pax6QfJ7Lt1EEBb+fCKShQTFOO8i8bXV4TyIVkwlmxm3r9BnXA==
  type: com.alibaba.druid.pool.DruidDataSource

spring.datasource.password: 配置加密后的密码(私钥),省略

  1. druid配置中的属性connectProperties
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500;config.decrypt=true;config.decrypt.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4P05ueQepxMJdZtm73eFEmL0wTZb7XN+PL7qdvttPhRrgSPLyTGh4sELFCLurOBC2R/rTysJ0K8Z5wuC1N2RYZ+SRQIIa9FvdlO30VrCstfJUGKlsuOqFKqcdm4nG/qOOAu0OKX2MYiwCnoyNl9fLS4jb6I9aNFJRAzlkzKXTH2gVuQxTyKT9z08uMfuxi7BxrTTY9+Ypqp8hqHDo+mN4i1CFKBx0xmUEp9TasiFCPabdbX2KmoPpH2iZZrvg0wSIxwRN42fwmuz+vZYytxq8x0vqFMr2GTpqMCBLYI3Q4JT2YHIfNc7y1LaHJliogL9HlPqz0Aox087vOTjomuXxQIDAQAB

config.decrypt(开启druid自带加密,必须):开启加密: true
config.decrypt.key(开启druid自带加密,必须):设置加密密钥(公钥),省略
config.file(开启druid自带加密,可选): 可以设置配置文件,适合管理配置或集群配置, 比如: 1. 文件路径 2. 网络地址(集群配置)
password(开启druid自带加密,可选): 密码配置, 可以在spring.datasource.password中不配置, 而在connectionProperties中配置

以下是详细配置

#spring配置
spring:
 devtools:
   restart:
     enabled: true
 #数据源配置
 datasource:
   driverClassName: org.h2.Driver
   url: jdbc:h2:mem:manage_db_test
   username: sa
   password: g31I5n/mlZBjZ3exuGppj12e9ofGUsTas12Xel4v+QB4uL04NqShZRLo1JqSLE9AjjdHgip/4p83GfQYdlf7VaIuVqbueSwIGSpqJu4eI/DKwdO6PqM4SUGoTXbkl4rbEC5SoNgOSZC+jk2PtFW3lEKBHXAkVWnvDAidD9Znd+GNMb7uHOYxKQxPkWyKI1eYYjAn9r70VAX5JYpCnINhcLG1p6EgzI0jXZSzyw2BW3eVdgaDfSHAYqL0inxGcvheXW65LuPHNbNSM2tK2md6mmG1U8GhAvUF/to3pax6QfJ7Lt1EEBb+fCKShQTFOO8i8bXV4TyIVkwlmxm3r9BnXA==
   type: com.alibaba.druid.pool.DruidDataSource
   ##数据初始化设置
   #进行该配置后,每次启动程序,程序都会运行
   schema: classpath:db/schema.sql
   #进行该配置后,每次启动程序,程序都会运行
   data: classpath:db/data.sql
   #表明使用的数据库平台是h2
   platform: h2
   ## druid 配置,Spring Boot 默认是不注入不了这些属性值的,需要自己绑定#druid 数据源专有配置
   druid:
     initialSize: 5
     minIdle: 5
     maxActive: 20
     # 配置获取连接等待超时的时间
     maxWait: 60000
     # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
     timeBetweenEvictionRunsMillis: 60000
     # 配置一个连接在池中最小生存的时间,单位是毫秒
     minEvictableIdleTimeMillis: 300000
     validationQuery: SELECT 1 FROM DUAL
     #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
     testWhileIdle: true
     #获取连接时执行检测,建议关闭,影响性能
     testOnBorrow: false
     #归还连接时执行检测,建议关闭,影响性能
     testOnReturn: false
     #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
     poolPreparedStatements: true
     #开启poolPreparedStatements后生效
     maxPoolPreparedStatementPerConnectionSize: 20
     #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入,去掉后监控界面sql无法统计,'wall'用于防火墙
     #config是为了数据库加密
     filters: stat,wall,log4j2,config
     # 合并多个DruidDataSource的监控数据 
     useGlobalDataSourceStat: false
     # 通过connectProperties属性来打开mergeSql功能;慢SQL记录: 500毫秒
     connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500;config.decrypt=true;config.decrypt.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4P05ueQepxMJdZtm73eFEmL0wTZb7XN+PL7qdvttPhRrgSPLyTGh4sELFCLurOBC2R/rTysJ0K8Z5wuC1N2RYZ+SRQIIa9FvdlO30VrCstfJUGKlsuOqFKqcdm4nG/qOOAu0OKX2MYiwCnoyNl9fLS4jb6I9aNFJRAzlkzKXTH2gVuQxTyKT9z08uMfuxi7BxrTTY9+Ypqp8hqHDo+mN4i1CFKBx0xmUEp9TasiFCPabdbX2KmoPpH2iZZrvg0wSIxwRN42fwmuz+vZYytxq8x0vqFMr2GTpqMCBLYI3Q4JT2YHIfNc7y1LaHJliogL9HlPqz0Aox087vOTjomuXxQIDAQAB"
     # Druid StatViewServlet配置
     stat-view-servlet:
       enabled: true
       url-pattern: /druid/*
       reset-enable: true
       login-username: admin
       login-password: admin
       allow: '127.0.0.1,10.0.0.1'
       deny: '10.0.0.1'
     # Druid WebStatFilter配置
     web-stat-filter:
       enabled: true
       url-pattern: /*
       exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,*.html'
       # profileEnable能够监控单个url调用的sql列表
       profileEnable: true

3. druid实现原理

具体流程, 请查看源代码:
com.alibaba.druid.filter.config.ConfigFilter
com.alibaba.druid.filter.config.ConfigTools

相关错误

  1. DER input, Integer tag error
    异常信息:
Exception in thread “main” java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DER input, Integer tag error 

这是由于, druid使用的是私钥加密, 公钥解密, 如果反了就会出错, 这也是druid加密不规范的地方, 具体是什么原因请看[参考资料2].

  1. Decryption error
    异常信息:
javax.crypto.BadPaddingException: Decryption error
	at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)
	at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)
	at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356)
	at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
	at javax.crypto.Cipher.doFinal(Cipher.java:2165)
	at com.alibaba.druid.filter.config.ConfigTools.decrypt(ConfigTools.java:151)
	at com.alibaba.druid.filter.config.ConfigTools.decrypt(ConfigTools.java:65)
	at com.example.spring.boot.mybatis.util.code.ConfigToolsDemo.demo2(ConfigToolsDemo.java:44)
	at com.example.spring.boot.mybatis.util.code.ConfigToolsDemo.main(ConfigToolsDemo.java:76)

这是由于, 密码密钥不匹配检查加密解密流程.

参考资料

  1. druid加密测试类: https://blog.csdn.net/kwaeh/article/details/103213447
  2. 历史原因, 使用私钥加密, 公钥解密. https://github.com/alibaba/druid/issues/960
  3. druid参考资料: https://github.com/alibaba/druid/wiki/使用ConfigFilter
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163570.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 伽马校正-「建议收藏」

    伽马校正-「建议收藏」伽马校正问题描述:读取图像,然后对图像进行伽玛校正。伽马校正这里是一篇写伽马校正比较好的文章,我觉得可以作为背景知识补充。伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正。如果图像原样显示在显示器等上,画面就会显得很暗。伽马校正通过预先增大RGB的值来排除显示器的影响,达到对图像修正的目的。由于下式引起非线性变换,在该式中,xxx被归一化,限定在[0,1][0,1][0,1]范围内。ccc是常数,ggg为伽马变量(通常取2.22.22.2):x′=c Iingx

  • 怎么使用linux命令重启服务器

    怎么使用linux命令重启服务器

  • 最简单也最难——怎样获取到Android控件的高度「建议收藏」

    最简单也最难——怎样获取到Android控件的高度

  • HTTP常见的状态码

    HTTP常见的状态码状态码解释200一切正常301永久重定向302临时重定向401用户名或密码错误403禁止访问(客户端IP地址被拒绝404文件不存在414请求URI头部过长500服务器内部错误502BadGateway(错误网关)…

  • 测试18

    测试18文章目录系统测试概述功能测试性能测试负载测试压力测试性能测试、压力测试、负载测试的关系兼容性测试安全测试健壮性测试配置测试可用性测试文档测试系统测试概述系统测试的定义将已

  • android自动化测试框架_GMS测试

    android自动化测试框架_GMS测试GMSP的测试已经开始一段时间了,这里记录一下跟O的不同之处,资料主要来自MTK官网。一、Case数量增加(以Pgo项目为例,64bit项目double)a、CTS测试增加8万条,module增至320b、增加CTS-INSTANT测试项目,module48,1.3万条(13338)、64bit13338,以实际为准;c、VTS测试增加约2…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号