大家好,又见面了,我是你们的朋友全栈君。
Druid 加密配置
前言
一般来说, 链接数据库的密码是明文存放的, 这样不安全, 任意获取到密码配置的人都可以获取到数据库的连接密码, 导致不安全的产生. druid有密码加密功能, 可以解决这个问题. druid使用rsa加密方式进行密码保护.(并不规范: 在后续问题中会讲)
总结
要配置druid密钥,
a. 配置connectionProperties属性: config.decrypt=true;config.decrypt.key=公钥
b. spring.datasource.password设置用私钥加密后的密码
注意:
- 尽量不要用 druid自带的加密解密方式, 可以在 druid的自定义配置类里面加上自己的解密方法.
- 如果一定要用druid自带的rsa加密解密方式, 请不要用自带的默认公钥/私钥
- 另外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个关注点:
- 配置中的属性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: 配置加密后的密码(私钥),省略
- 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
相关错误
- 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].
- 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)
这是由于, 密码密钥不匹配检查加密解密流程.
参考资料
- druid加密测试类: https://blog.csdn.net/kwaeh/article/details/103213447
- 历史原因, 使用私钥加密, 公钥解密. https://github.com/alibaba/druid/issues/960
- druid参考资料: https://github.com/alibaba/druid/wiki/使用ConfigFilter
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163570.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...