【问题标题】:java regex to mask credit card details in logjava正则表达式在日志中掩盖信用卡详细信息
【发布时间】:2023-03-28 15:50:01
【问题描述】:

这是我当前正在服务器日志中打印的请求字符串。

PaymentRequest{Id=123456, type=CREDIT_CARD, creditCardDetails=CreditCardDetails{type=VISA, name=Some Name, number=1234567890123456, expiry=0316, CCV=000}, directDebitDetails=null}

我想为上述请求中的数字字段创建一个掩码,以便当它在日志中打印时看起来像 123456789012--HIDDEN--(最后 4 位数字替换为“隐藏”)。

要创建什么 Java 正则表达式,以便它能够稳健地处理以下情况?

  • 如果 [field=value] 即 number=1234567890123456 在 字符串。
  • 信用卡号可以是 0 到 16 之间的任意长度,例如 number= OR number=0 或 number=10 或 number=1234567890123456。
  • 如果 number 小于 4,则最终输出为 number=--HIDDEN--
  • 如果 number 不存在,即 number=,则什么也不做。
  • number=1234567890123456 可能在中间,例如..., name=Some Name, number=1234567890123456}, ... 或者最后例如..., number=1234567890123456, name=Some Name}, ...

【问题讨论】:

  • @Kaizar : 当数字为空或包含少于 4 个字符时该怎么办?
  • @blackSmith 什么都不做,我考虑的目的是,如果是这种情况,它不应该抛出异常。
  • 你的意思是从长度1到16?
  • @Sniffer 不,0 到 16,我刚刚更正了。感谢您的澄清。
  • 那么如果数字小于四位数,那么要屏蔽或隐藏什么?

标签: regex logging credit-card masking


【解决方案1】:

好的,您可以使用一行代码来完成此操作,我花了一些时间才弄清楚如何做,但结果如下:

String input = "PaymentRequest{Id=123456, type=CREDIT_CARD, creditCardDetails=CreditCardDetails{type=VISA, name=Some Name, number=1234567890123456, expiry=0316, CCV=000}, directDebitDetails=null}"
String result = inputString.replaceAll("(?=number=\\d{1,16},)(number=\\d*?)\\d{1,4},", "$1--HIDDEN--,");
System.out.println(result);

如果有任何问题,请告诉我。

【讨论】:

  • @KaizarLaxmidhar 我测试了你的输入字符串,它工作正常。您链接到的网站正在使用 Action Script 3 正则表达式引擎,它可能与我使用的 Java 正则表达式不同,换句话说,它的工作方式可能不同,或者可能不支持 Java 正则表达式引擎支持的所有内容。
  • @KaizarLaxmidhar 这是我使用的 Java 源代码文件,Download Here
  • @KaizarLaxmidhar 谢谢你,很高兴我能帮忙。
【解决方案2】:

这是你可以做的:

    String num="PaymentRequest{Id=123456, type=CREDIT_CARD, creditCardDetails=CreditCardDetails{type=VISA, name=Some Name, number=1234567890123456, expiry=0316, CCV=000}, directDebitDetails=null}";
    Pattern p = Pattern.compile("number=[0-9]*,");
    Matcher m = p.matcher(num); 
    m.find();
    System.out.println(num.replaceFirst(m.group(), m.group().replaceFirst("[0-9]{4},","****,")));

我希望我能提供更好的解决方案。

【讨论】:

  • 我想直接将正则表达式应用于提到的字符串,而不需要额外的字符串操作。希望我不要太有野心。
  • 是的,你是。对我来说,在单个正则表达式中是不可能的。更新了答案。
  • 虽然不像我想要的那样一次性完成,但您的解决方案有效。谢谢。您知道如何更改模式以处理 number=1234567890123456 在 {} 中最后出现的情况,因此它看起来像 {..., number=1234567890123456}, ... 总之,可以处理任何一个数字的模式是在集合之间或最后一个。
  • 您必须从两个 reg ex 的末尾删除逗号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2011-06-02
  • 2016-01-02
  • 1970-01-01
  • 2023-03-17
  • 2014-02-05
相关资源
最近更新 更多