You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hikari CP的DEBUG日志中隐藏HikariConfig的连接密码

如何在HikariConfig DEBUG日志中掩码连接密码

要解决HikariCP配置日志里明文暴露密码的问题,这里有几个实用的方案:

方案1:自定义HikariConfig扩展类覆盖toString方法

HikariCP原生的HikariConfig可能没完全覆盖所有自定义敏感字段的掩码(比如你日志里的SSL_TRUSTSTORE_PASSWORD),可以写个扩展类手动处理:

import com.zaxxer.hikari.HikariConfig;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MaskedHikariConfig extends HikariConfig {
    // 匹配所有需要掩码的敏感字段,大小写不敏感
    private static final Pattern SENSITIVE_FIELDS = Pattern.compile("(password|SSL_TRUSTSTORE_PASSWORD)=[^,]+", Pattern.CASE_INSENSITIVE);

    @Override
    public String toString() {
        String originalLog = super.toString();
        Matcher matcher = SENSITIVE_FIELDS.matcher(originalLog);
        // 把匹配到的明文替换成掩码标识
        return matcher.replaceAll("$1=***MASKED***");
    }
}

之后创建配置时用这个自定义类代替原生HikariConfig,日志打印配置时就会自动掩码敏感字段。

方案2:通过日志框架配置掩码过滤器

不想改代码的话,直接在日志框架(比如Logback、Log4j2)里加正则替换规则,拦截Hikari的日志输出:

Logback实现示例

在logback.xml里定义自定义转换器并关联到Hikari的日志:

<configuration>
    <!-- 注册密码掩码转换器 -->
    <conversionRule conversionWord="maskHikariSensitive" converterClass="com.yourpackage.MaskHikariSensitiveConverter" />

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %maskHikariSensitive(%msg)%n</pattern>
        </encoder>
    </appender>

    <!-- 开启Hikari配置的DEBUG日志,并应用掩码 -->
    <logger name="com.zaxxer.hikari.HikariConfig" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
</configuration>

然后实现转换器类:

import ch.qos.logback.classic.pattern.MessageConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MaskHikariSensitiveConverter extends MessageConverter {
    private static final Pattern SENSITIVE_PATTERN = Pattern.compile("(password|SSL_TRUSTSTORE_PASSWORD)=[^,]+", Pattern.CASE_INSENSITIVE);

    @Override
    public String convert(ILoggingEvent event) {
        String logMsg = event.getMessage();
        if (logMsg != null && logMsg.contains("com.zaxxer.hikari.HikariConfig dataSourceProperties")) {
            Matcher matcher = SENSITIVE_PATTERN.matcher(logMsg);
            return matcher.replaceAll("$1=***MASKED***");
        }
        return logMsg;
    }
}

Log4j2实现示例

直接在log4j2.xml的PatternLayout里用正则替换:

<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %replace{%msg}{(password|SSL_TRUSTSTORE_PASSWORD)=[^,]+}{$1=***MASKED***}%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.zaxxer.hikari.HikariConfig" level="DEBUG" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

这种方式不用改动业务代码,纯配置就能解决问题,适合快速落地。

方案3:规范敏感属性的设置方式

确保通过Hikari提供的专属方法设置核心密码,自定义敏感属性避免直接存入dataSourceProperties:

Properties dataSourceProps = new Properties();
// 普通属性正常设置
dataSourceProps.setProperty("url", "JDBC_URL");
dataSourceProps.setProperty("user", "ABC");
// 自定义敏感属性不要放这里,用驱动专属的设置方法传入
dataSourceProps.setProperty("SSL_TRUSTSTORE_PASSWORD", "***MASKED***");

HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDataSourceProperties(dataSourceProps);
// 核心密码用Hikari的setPassword方法,内部会自动掩码
hikariConfig.setPassword("Password@123");
// 比如Informix的SSL信任库密码,可以直接通过驱动的特定API设置,不进入日志打印的属性集合

这样日志里的dataSourceProperties就不会出现明文敏感信息了。


内容的提问来源于stack exchange,提问作者Shubham kapoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:17:37