我有一个包含敏感信息的课程(信用卡信息,电话号码等)。
我希望能够将此类传递给log4j,但让它隐藏某些信息。
如果我有一个具有getPhoneNumber,getCreditCardNumber方法的UserInformation类,我将如何自定义log4j或这个类,以便它可以正确地模糊数字。
我希望信用卡号输出为xxxx-xxxx-xxxx-1234,输出的电话号码为xxxx-xxx-xxx,假设这些号码为1234-1234-1234-1234和1234-567- 890
由于
答案 0 :(得分:6)
您可以尝试通过编写隐藏这些模式的自定义日志记录格式化程序来实现此目的。但我认为这有点狡猾...因为有人可能会通过调整记录器配置文件等意外或故意绕过这个。
我认为最好根据您组装日志消息的方式执行以下操作之一:
UserInformation
上的替代getter方法来汇编日志消息。toString
上的UserInformation
方法以隐藏详细信息。答案 1 :(得分:5)
我会为这些字段编写一个混淆格式化程序,并使用它来写入日志文件。
我也会问为什么你会继续使用String原语而不是可以封装相应行为的对象。
答案 2 :(得分:0)
更新:最好的选择可能是将实际对象包装在一个Obfuscated-ClassName包装器中,该包装器实现相同的接口但返回模糊版本(通过委托给真实对象并模糊结果)并将它们交给日志记录系统。这只适用于您自己实际传递这些对象的情况,而不是它们是对象树的一部分 - 这可能会使整个情况变得更复杂。
旧:
也许你应该只添加getPhoneNumberForLogging()/ getObfuscatedPhoneNumber()类型函数? (当然,您必须考虑到,如果您将包含此数据的对象交给另一个对象/进程,则无法控制对“正常”函数的访问,因此从技术上讲,您根本不会屏蔽数据 - 尽管它可能是可能的使显示敏感数据包的方法只能在本地访问?)
你也可以在每次通话时investigate the call stack并尝试弄清楚是否要返回完整数据或模糊版本 - 这会增加相当多的开销,可能会调试非常棘手。