文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

优雅!Spring Boot处理日志中的敏感数据

2024-11-29 18:17

关注

1. 简介

在当前的数据保护时代,我们必须高度重视个人敏感数据的处理与记录。鉴于数据量庞大,我们在记录这些信息时,必须格外小心,采取适当措施来屏蔽或保护用户的敏感信息,以保障他们的隐私权不受侵犯。

本篇文章,我将详细介绍如何使用 Logback 隐藏日志中的敏感数据。虽然这种方法是日志文件的最后一道防线,但它并不是解决问题的最终方案。敏感数据是指任何需要防止未经授权访问的信息。这可能包括任何个人身份信息,如社会安全号码、银行信息、登录凭据、地址、电子邮件等。

Logback 是 Java 社区使用最广泛的日志框架之一。它取代了其前身 Log4j。Logback 的实现速度更快,配置选项更多,而且在归档旧日志文件方面更具灵活性。

接下来,我们将在登录应用程序日志时屏蔽属于用户的敏感数据。

2. 实战案例

2.1 环境准备

准备实体对象

public class User {
  private Long id ;
  private String name ;
  private String address ;
  private String phone ;
  private String password ;
  private String email ;
  // getters, setters
}

我们后续将对上面的name,phone,password,email进行脱敏处理。

接口定义

@GetMapping("/login")
public User login() throws Exception {
  // TODO
  User user = new User(1L, "张三", "新疆", "1399999999", "123456789", "xxxooo@qq.com") ;
  logger.info("用户信息: {}", new ObjectMapper().writeValueAsString(user)) ;
  return user ;
}

在正常情况下访问上面的接口日志输出如下:

图片

接下来,我们将要处理这里的敏感字段。

2.2 自定义PatternLayout

PatternLayout类可以通过模式字符串配置的灵活布局。这个类的目标是格式化一个ILoggingEvent并以{#link String}的形式返回结果。结果的格式取决于转换模式。

public class MaskingPatternLayout extends PatternLayout {


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


  public void addMaskPattern(String maskPattern) {
    maskPatterns.add(maskPattern);
    multilinePattern = Pattern.compile(maskPatterns.stream().collect(Collectors.joining("|")), Pattern.MULTILINE);
  }


  @Override
  public String doLayout(ILoggingEvent event) {
    return maskMessage(super.doLayout(event));
  }


  private String maskMessage(String content) {
    if (multilinePattern == null) {
      return content;
    }
    StringBuilder sb = new StringBuilder(content);
    Matcher matcher = multilinePattern.matcher(sb);
    while (matcher.find()) {
      IntStream.rangeClosed(1, matcher.groupCount()).forEach(group -> {
        if (matcher.group(group) != null) {
          IntStream.range(matcher.start(group), matcher.end(group)).forEach(i -> sb.setCharAt(i, '*'));
        }
      });
    }
    return sb.toString();
  }
}

PatternLayout.doLayout()的实现负责在应用程序的每条日志信息中屏蔽匹配的数据,前提是这些数据与配置的模式之一相匹配。

接下来就可以在logback-spring.xml中配置;logback.xml 中的 maskPatterns 列表可构建多行模式。如果它以属性列表的形式出现,那么每个配置项都会调用 addMaskPattern。

2.3 配置Appender


  
    
      \"name\"\s*:\s*\"(.*?)\"
      \"phone\"\s*:\s*\"(.*?)\"
      \"password\"\s*:\s*\"(.*?)\"
      ([\w.-]+@[\w.-]+\.\w+)
      %d{22:mm:ss} %-5level %logger Line:%-3L - %msg%n
      UTF-8
    
  

这里我添加了4个模式用来匹配上面提到的4个字段。有个该配置后再次进行访问上面的接口

图片

控制台日志输出

正确的将我们需要处理的字段进行了脱敏。

如果我们是直接打印的对象呢?

User user = new User(1L, "张三", "新疆", "1399999999", "123456789", "xxxooo@qq.com") ;
logger.info("用户信息: {}", new ObjectMapper().writeValueAsString(user)) ;
logger.info("直接打印对象: {}", user) ;

日志输出

图片

对于这种情况,我们还需要定义更多的模式,如下:

name\s*=\s*(.*?),
password\s*=\s*(.*?),

再次访问接口

正确的脱敏了此种情况。

来源:Spring全家桶实战案例源码内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯