如何使用slf4j框架实现敏感数据脱敏?

问题描述 投票:0回答:4

我想使用 slf4j 框架屏蔽敏感数据,例如用户名/密码。感谢您立即提供帮助。预先感谢。

slf4j
4个回答
4
投票

试试这个。 1. 首先,我们应该创建一个类来处理我们的日志(每行)

public class PatternMaskingLayout extends PatternLayout {

private Pattern multilinePattern;
private List<String> maskPatterns = new ArrayList<>();

public void addMaskPattern(String maskPattern) { // invoked for every single entry in the xml
    maskPatterns.add(maskPattern);
    multilinePattern = Pattern.compile(
            String.join("|", maskPatterns), // build pattern using logical OR
            Pattern.MULTILINE
    );
}

@Override
public String doLayout(ILoggingEvent event) {
    return maskMessage(super.doLayout(event)); // calling superclass method is required
}

private String maskMessage(String message) {
    if (multilinePattern == null) {
        return message;
    }
    StringBuilder sb = new StringBuilder(message);
    Matcher matcher = multilinePattern.matcher(sb);
    while (matcher.find()) {
        if (matcher.group().contains("creditCard")) {
            maskCreditCard(sb, matcher);
        } else if (matcher.group().contains("email")) {
            // your logic for this case
        }
    }
    return sb.toString();
}
private void maskCreditCard(StringBuilder sb, Matcher matcher) {
    //here is our main logic for masking sensitive data
    String targetExpression = matcher.group();
    String[] split = targetExpression.split("=");
    String pan = split[1];
    String maskedPan = Utils.getMaskedPan(pan);
    int start = matcher.start() + split[0].length() + 1;
    int end = matcher.end();
    sb.replace(start, end, maskedPan);
}

}

  1. 第二步是我们应该为logback创建appender到logback.xml

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="com.bpcbt.micro.utils.PatternMaskingLayout">
            <maskPattern>creditCard=\d+</maskPattern> <!-- SourcePan pattern -->
            <pattern>%d{dd/MM/yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%ex</pattern>-->
        </layout>
    </encoder>
    

  2. 现在我们可以在代码中使用记录器了

    log.info("信用卡上下文设置为creditCard={}",creditCard);

  3. 结果,我们会看到

    日志中的一行

    信用卡的卡上下文设置=11111*****111

如果没有这些选项,我们的日志将像这一行

card context set for creditCard=1111111111111

3
投票

也许这个库会有帮助:owasp-security-logging

OWASP 安全日志项目相关 并提供相关功能:

LOGGER.info("userid={}", userid);  
LOGGER.info(SecurityMarkers.CONFIDENTIAL, "password={}", password);

目的是在日志中产生以下输出:

2014-12-16 13:54:48,860 [main] INFO - userid=joebob
2014-12-16 13:54:48,860 [main] [CONFIDENTIAL] INFO - password=***********

您可以在Wiki

中找到更多内容

2
投票

假设您正在使用 Java/Groovy。在您的 log4j2.xml 中,添加类似以下内容:

<PatternLayout pattern="%mm"/>

然后采用该模式并为其创建一个转换器:

@Plugin(name = 'maskLog', category = 'Converter')
@ConverterKeys(['mm'])
class MaskLogConverter extends LogEventPatternConverter {
    
    private static final String NAME = 'mm'
    
    private MaskLogConverter(String[] options) {
        super(NAME, NAME)
    }
    
    static LogMaskingConverter newInstance(final String[] options) {
        return new LogMaskingConverter(options)
    }
    
    @Override
    void format(LogEvent event, StringBuilder outputMessage) {
        String message = event.message//.formattedMessage
        
        // Do your masking logic here
        
        outputMessage.append(message)
    }
}

在该类中,您可以相应地进行屏蔽、转换、解析等。


-9
投票

框架本身不会进行屏蔽,您也不应该期望它会这样做。将机密信息传递给报告系统是一种非常糟糕的做法。在您的

log.info()
通话中,请确保用星号替换密码。屏蔽用户名是没有意义的,因为您可能不记录任何内容。

log.info("Successful login: {0} ********", username);
© www.soinside.com 2019 - 2024. All rights reserved.