如何在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
相关产品推荐
相关产品推荐

