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)


相关推荐

  • softreference 回收_method verification

    softreference 回收_method verification一、softReference的作用    SoftReference的主要特点就是在当内存不够的时候,GC会回收SoftReference所引用的对象。所以,在memorysensitive的项目中将某些数据设置成SoftReference可以避免内存的溢出。1、创建一个SoftReferenceSoftReference>softReference=newSof

  • 20考研 | 2020考研全程规划,19上岸复旦学长。各科各阶段复习规划。

    20考研 | 2020考研全程规划,19上岸复旦学长。各科各阶段复习规划。下面我在分享一下我之前写过的一篇文章高能干货预警文章目前30142字,这可能是最负责的一篇文章了。文章很长,建议拿好笔记慢慢看。本文会解决你在考研各科在不同时期不同阶段遇到的所有问题,方法具体到草稿纸怎么使用,课本具体怎么使用,相信我,读完你一定会有巨大收获。我总结了我一年以来遇到的所有问题,使用的所有方法。既然最终目的是在考研这场「考试」中获得高分,那么所有的时间和精力,都应该围绕…

  • random函数用法笔记

    random函数用法笔记1.导入random模块importrandom2.生成(n,m)之间的随机整数>>>importrandom>>>a=random.randint(1,10)#1<=a<=10且n,m大小必须n<m>>>print(a)3>>>3.取0-1之间随机浮点数…

  • MyBatis Plus 实现多表分页查询

    MyBatis Plus 实现多表分页查询在MybatisPlus中,虽然IService<T>接口帮我们定义了很多常用的方法,但这些都是T对象有用,如果涉及到多表的查询,还是需要自定义Vo对象和自己编写sql语句,MybatisPlus提供了一个Page对象,查询是需要设置其中的size字段和current字段的值一、分页配置 可以直接使用selectPage这样的分页,但返回的数据确实…

  • Tomcat安装及配置教程(超详细的图文教程)「建议收藏」

    Tomcat安装及配置教程(超详细的图文教程)「建议收藏」Tomcat安装及配置教程(超详细的图文教程)1.什么是TomcatTomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上T…

  • 岭回归、LASSO回归(包括公式推导)[通俗易懂]

    岭回归、LASSO回归(包括公式推导)[通俗易懂]前面的两篇文章比较清楚浅显的介绍了线性回归、多项式回归,并了解到其实多项式回归也可以看作是一种特殊的线性回归形式,也就是说回归的核心就是线性回归。其原理都是最小二乘法,这是一种很简单、很方便的算法,但也有它的局限性,所以本文讲述另外的回归方式岭回归、LASSO回归,作为一个补充,解决最小二乘法的一些缺点。最小二乘法的局限性:                 …

发表回复

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

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