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

标签 java regex xml data-masking

我正在创建一个连接到多个第三方 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,例如,通过小心地将注释、空格或 namespace 声明插入到您正在查找的标签中。

您的目标似乎很困惑:您要求一种“优化”方式,但您使用正则表达式是因为它“最简单”。另外,您还没有说“屏蔽”数据应该是什么样子(不要指望我从正则表达式对您的要求进行逆向工程 - 您可能会发现正则表达式很容易编写,但没有人发现它们很容易阅读)。

如果您有性能要求,则需要对其进行量化。如果你无法量化它,那么尝试用 XSLT 进行编码,看看它是否足够快;我的猜测是,几乎可以肯定是这样。如果您确实需要比这更好的性能,那么尝试在 SAX 中实现;但你距离“最简单”还有很长的路要走。

在 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>

我认为在所有方面都与您的正则表达式解决方案相比较:性能、可读性,以及最重要的正确性。

关于java - 在 Java 中屏蔽 XML 中敏感数据的性能优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61494951/

相关文章:

java - 在哪里可以从 Twitter 搜索返回的 HttpClient 获取 http 响应代码?

regex - 这行Perl毫无意义吗? s/^(\d +)\b/$ 1/sg

javascript - 将表解析为正则表达式方法

ruby - 解析地址簿中的电子邮件

xml - 解析 XML 文件并需要所需的格式通过 Awk 命令 Linux

java - 2x2 按钮网格布局

Java编译错误加载类路径

java - 如何解决 'HttpHeaders' has private access in 'org.apache.http.HttpHeaders' 错误

java - 使用 Java 登录我的 Sprint 手机网络帐户并获取帐户详细信息的最佳方式?

java - XPath XML 命名空间问题