Java 为敏感数据定制log4j日志记录

Java 为敏感数据定制log4j日志记录,java,log4j,Java,Log4j,我有一个包含敏感信息(信用卡信息、电话号码等)的类 我希望能够将这个类传递给log4j,但是让它隐藏某些信息 如果我有一个类UserInformation,它包含getPhoneNumber、getCreditCardNumber方法,我将如何自定义log4j或这个类,以便它正确地隐藏这些数字 我希望信用卡号输出为xxxx-xxxx-xxxx-1234,电话号码输出为xxxx-xxx-xxx,因为它们是1234-1234-1234-1234和1234-567-890 谢谢您可以尝试通过编写自定义

我有一个包含敏感信息(信用卡信息、电话号码等)的类

我希望能够将这个类传递给log4j,但是让它隐藏某些信息

如果我有一个类UserInformation,它包含getPhoneNumber、getCreditCardNumber方法,我将如何自定义log4j或这个类,以便它正确地隐藏这些数字

我希望信用卡号输出为xxxx-xxxx-xxxx-1234,电话号码输出为xxxx-xxx-xxx,因为它们是1234-1234-1234-1234和1234-567-890


谢谢

您可以尝试通过编写自定义日志记录格式化程序来实现这一点,该格式化程序可以隐藏这些模式。但我认为这有点狡猾。。。因为有人可能会意外或故意通过调整记录器配置文件等来规避此问题

我认为最好执行以下操作之一,具体取决于您组装日志消息的方式:

  • 更改代码中的记录器调用,以使用
    UserInformation
    上的替代getter方法组合日志消息,该方法会隐藏敏感字段
  • UserInformation
    上的
    toString
    方法更改为隐藏详细信息

更新:最好的选择可能是将真实对象包装在模糊类名包装器中,该包装器实现相同的接口,但返回模糊版本(通过委托给真实对象并模糊结果),并将其交给日志系统。这只适用于您自己实际传入这些对象的情况,而不适用于它们是对象树的一部分的情况——这可能会使整个情况更加复杂

旧的:

也许您应该添加getPhoneNumberForLogging()/getObfuscatedPhoneNumber()类型的函数?(当然,您必须考虑到,如果您将包含此数据的对象交给另一个对象/进程,您无法控制对“正常”函数的访问,因此从技术上讲,您根本不会屏蔽数据-尽管可能会使显示敏感数据包的方法仅可本地访问?)


您还可以在每次调用时尝试确定是否要返回完整数据或模糊版本-这将增加相当多的开销,并且可能非常难以调试。

我将为这些字段编写模糊格式设置程序,并使用它写入日志文件

我还想问,为什么要继续使用字符串原语而不是可以封装适当行为的对象