Druid(三)数据源密码加密及回调解密

项目为提高安全性,将jdbc.properties文件中数据库连接的明文密码改为密文。采用des方式对原密码进行可逆加密,配置Druid回调解密类,继承DruidPasswordCallback并重写方法,还需在数据源配置文件添加相关配置,加密后的密码从项目中获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中的 jdbc.properties 文件中配置的数据库连接信息中密码是明文密码,现在考虑配置密码密文以提高安全性。

1. 采用可逆的加密方式对原密码进行加密(此处采用des方式加密和解密)。

    加密和解密过程参考另一篇博文:https://blog.csdn.net/HSH205572/article/details/95307512

2. 配置Druid回调解密类,此类需要继承 DruidPasswordCallback, 并重写 它的 setProperties(Properties properties) 方法。

import com.alibaba.druid.util.DruidPasswordCallback;
import org.apache.commons.lang3.StringUtils;

import java.util.Properties;

/**
 * 描述 数据库密码回调解密 - 继承 DruidPasswordCallback,
 * 并重写 setProperties(Properties properties) 方法。
 *
 * @author ***
 * @date 2019/7/10 10:26
 */
public class DbPasswordCallback extends DruidPasswordCallback {

    /**
     * 数据库密码解密
     *
     * @param properties
     */
    @Override
    public void setProperties(Properties properties) {
        super.setProperties(properties);
        String pwd = properties.getProperty("password");
        if (StringUtils.isNotBlank(pwd)) {
            try {
                //这里的password是将jdbc.properties配置得到的密码进行解密之后的值,所以这里的代码是将密码进行解密
                String password = DesUtil.decrypt(pwd);
                setPassword(password.toCharArray());
            } catch (Exception e) {
                setPassword(pwd.toCharArray());
            }
        }
    }

}

上述类中的 DesUtil 是工具类,在步骤一中的博文可以看到。

3.  在数据源配置文件中 添加如下红色部分配置。

<!--数据库密码回调解密bean-->
<bean id="dbPasswordCallback" class="com.***.***.utils.DbPasswordCallback" lazy-init="true"/>

<!-- 默认数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="driverClassName" value="${spring.jdbc.driverClass}"/>
    <property name="url" value="${spring.jdbc.jdbcUrl}"/>
    <property name="username" value="${spring.jdbc.user}"/>
    <property name="password" value="${spring.jdbc.password}"/>
    <property name="filters" value="stat"/>
    ...
    ...
    <!--密码加密回调解密-->
    <property name="connectionProperties" value="password=${spring.jdbc.password}"/>
    <property name="passwordCallback" ref="dbPasswordCallback"/>

    ...
    ...
</bean>

注:上述配置中的 ${spring.jdbc.password} 拿到的是 项目中经过加密后的数据库密码。

### 德鲁伊数据库连接池的配置及使用方法 德鲁伊(Druid)是一个高效的数据库连接池,广泛应用于Java项目中。它不仅提供了基本的连接管理功能,还具备监控、日志记录和安全性增强的能力[^4]。 #### 1. Maven依赖引入 在使用德鲁伊之前,需要先将其作为依赖项加入到项目的`pom.xml`文件中: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> ``` 此版本号可以根据实际需求调整。 --- #### 2. 配置德鲁伊数据源 德鲁伊的数据源可以通过多种方式进行配置,以下是常见的两种方式:代码配置和Spring Boot中的YAML/Properties配置。 ##### (1) 使用代码手动创建数据源 以下是一个简单的代码示例,展示如何通过Java代码初始化德鲁伊连接池: ```java import com.alibaba.druid.pool.DruidDataSource; public class DruidConfig { public static void main(String[] args) throws Exception { DruidDataSource dataSource = new DruidDataSource(); // 设置数据库基本信息 dataSource.setUrl("jdbc:mysql://localhost:3306/test_db"); dataSource.setUsername("root"); dataSource.setPassword("password"); // 设置初始连接数 dataSource.setInitialSize(5); // 设置最大活跃连接数 dataSource.setMaxActive(20); // 设置最小闲置连接数 dataSource.setMinIdle(5); // 设置获取连接的最大等待时间 dataSource.setMaxWait(60000); System.out.println("Data source initialized successfully."); } } ``` 以上代码展示了如何设置URL、用户名、密码以及其他必要的参数。 --- ##### (2) Spring Boot中的配置 如果是在Spring Boot环境中使用德鲁伊,则可以直接通过`application.yml`或`application.properties`文件完成配置。 ###### YAML配置示例: ```yaml spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username: root password: password druid: initial-size: 5 max-active: 20 min-idle: 5 max-wait: 60000 stat-view-servlet: enabled: true url-pattern: /druid/* ``` 上述配置启用了德鲁伊的统计视图,并设置了访问路径为`/druid/*`。 --- #### 3. 功能扩展与优化 除了基本的连接管理外,德鲁伊还可以实现更多高级功能,例如SQL监控、密码加密等。 ##### (1) SQL执行监控 启用StatFilter插件可以跟踪并分析SQL语句的执行性能: ```java import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.wall.WallFilter; public class DruidMonitorConfig { public static void addFilters(DruidDataSource dataSource) { StatFilter statFilter = new StatFilter(); statFilter.setLogSlowSql(true); // 记录慢查询 statFilter.setMergeSql(true); // 合并SQL statFilter.setSlowSqlMillis(5000); // 定义慢查询阈值 WallFilter wallFilter = new WallFilter(); // 添加防火墙过滤器 wallFilter.setDbType("mysql"); // 指定数据库类型 dataSource.getProxyFilters().add(statFilter); dataSource.getProxyFilters().add(wallFilter); } } ``` --- ##### (2) 密码加密保护 为了提升安全性,建议对敏感信息(如数据库密码)进行加密处理。德鲁伊支持通过回调接口解密密码: ```java dataSource.setPasswordCallback((info, keyStorePassword) -> { String encryptedPassword = info.getProperty("encrypted_password", String.class); return decryptPassword(encryptedPassword); // 自定义解密逻辑 }); ``` 具体解密算法需根据实际情况设计。 --- ### 结论 德鲁伊作为一个高性能的数据库连接池,在日常开发中有诸多优势,包括但不限于易用性高、兼容性强以及丰富的扩展能力。无论是小型项目还是大型企业级应用,都可以从中受益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值