在 Java 中屏蔽 XML 中的敏感数据的性能优化方法

Performance optimized approach to mask sensitive data in XML in Java

我正在创建一个连接到多个第三方 API 的项目。因此,作为审计,我跟踪发送到这些 API 和从这些 API 发送的所有请求和响应。这些请求和响应的格式为 XML。这些 XML 请求和响应包含一些我需要屏蔽的敏感信息,例如 PII 和信用卡号。

这些是 XML

中可用的示例标签
<myTag>someSensitiveInformation</myTag>
<myTag sensitiveInfo = foo, sensitiveTwo = bar>SomeOtherSensitiveInfo</myTag>
<myTag sensitiveInfo = foo, sensitiveTwo = bar>

我可以用以下正则表达式掩盖它们

(<myTag)([\s\S]*?)(\/>)|(<myTag)([\s\S]*?)(>)([\s\S]+?)(<\/myTag>)

以上所有情况下的屏蔽标签都是这样的,

<myTag>*************</myTag>

这很好用。但是当流量很高时,此正则表达式评估会导致 CPU 峰值,有时整个项目会冻结。其中一些 XML 请求和响应的大小约为 100kb。我确实有多个请求和响应对应于单个用户操作,所有这些请求和响应都应该从上面的正则表达式中屏蔽,当我的项目流量低时它会这样做。

有没有优化的方法来做到这一点。是的,我知道不建议将正则表达式用于 XML 标记识别,但这似乎是最简单的方法。任何在不牺牲性能的情况下执行这种屏蔽的外部库,我不喜欢使用 log4j 屏蔽,因为它似乎会在 JVM 内部累积日志。或者 java 中针对这种情况的适当解决方案是什么。

提前致谢。

不要使用正则表达式来处理XML。首先,它可能非常低效。其次,在这种情况下哪个更重要,它几乎总是不正确的;知道您在做什么的攻击者将能够构造 XML 来破坏您的正则表达式,例如,通过在您要查找的标记中小心插入注释或空格或名称空间声明。

您的目标似乎很混乱:您要求 "optimized" 方式,但您使用的是正则表达式,因为它是 "easiest"。此外,您还没有说 "masked" 数据应该是什么样子(不要指望我从正则表达式中逆向工程您的需求 - 您可能会发现正则表达式易于编写,但没有人认为它们易于阅读).

如果你有性能需求,你需要量化它。如果您不能量化它,那么尝试用 XSLT 编码,看看它是否足够快;我的猜测是它几乎肯定是。如果您真的需要比这更好的性能,请尝试在 SAX 中实现;但是你离 "easiest".

还有很长的路要走

在 XSLT 3.0 中,它只是:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0">
  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="myTag">
    <myTag>**************</myTag>
  </xsl:template>
</xsl:transform>

而且我认为在所有方面都优于您的正则表达式解决方案:性能、可读性,最重要的是正确性。