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



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

这些是XML 中可用的示例标签

<myTag>someSensitiveInformation</myTag>
<myTag sensitiveInfo = foo, sensitiveTwo = bar>SomeOtherSensitiveInfo</myTag>
<myTag sensitiveInfo = foo, sensitiveTwo = bar>

我可以用下面的正则表达式屏蔽它们

(<myTag)([sS]*?)(/>)|(<myTag)([sS]*?)(>)([sS]+?)(</myTag>)

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

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

这很好。但是当流量很高时,这种regex评估会导致CPU峰值,有时整个项目会冻结。其中一些XML请求和响应的大小约为100kb。我确实有多个与单个用户操作相对应的请求和响应,所有这些请求和响应都应该从上面的regex中屏蔽掉,当我的项目流量较低时也会屏蔽掉。

有没有一种优化的方法可以做到这一点。是的,我知道regex不建议用于XML标记识别,但这似乎是最简单的方法。任何在不牺牲性能的情况下进行这种屏蔽的外部库,我都不喜欢使用log4j屏蔽,因为它似乎会在JVM中累积日志。或者,对于这类场景,java中合适的解决方案是什么。

提前谢谢。

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

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

如果你有一个性能需求,你需要量化它。如果你不能量化它,那么试着用XSLT编码,看看它是否足够快;我的猜测是几乎可以肯定的。如果你真的需要比这更好的性能,那么试着用SAX来做;但你离"最简单"还有很长的路要走。

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

我认为在性能、可读性以及最重要的正确性方面,与您的regex解决方案相比都是有利的。

最新更新