Оптимизированный по производительности подход для маскировки конфиденциальных данных в XML в Java - PullRequest
0 голосов
/ 29 апреля 2020

Я создаю проект, который подключается к нескольким сторонним 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>

Это сработало нормально. Но когда трафик c высокий, эта оценка регулярных выражений приводит к скачкам ЦП, и иногда весь проект останавливается. Некоторые из этих XML запросов и ответов имеют размер около 100 КБ. У меня есть несколько запросов и ответов, соответствующих одной пользовательской операции, и все они должны быть замаскированы из приведенного выше регулярного выражения, и это происходит, когда в моем проекте есть низкий трафик c.

Есть ли оптимизированный способ сделать это. И да, я знаю, что регулярное выражение не рекомендуется для XML идентификации тегов, но это, кажется, самый простой подход. Любые внешние библиотеки, которые выполняют такого рода маскирование без снижения производительности, я предпочитаю не использовать маскировку log4j, поскольку она, по-видимому, накапливает журналы внутри JVM. Или какое было бы подходящее решение в java для такого рода сценариев ios.

Заранее спасибо.

1 Ответ

1 голос
/ 29 апреля 2020

Не используйте регулярные выражения для обработки XML. Во-первых, это может быть очень неэффективно. Во-вторых, что более важно в этом случае, это почти всегда неправильно; злоумышленник, который знает, что вы делаете, сможет создать XML, который побеждает ваше регулярное выражение, например, путем аккуратной вставки комментариев или объявлений пробелов или пространств имен в теги, которые вы ищете.

Ваши цели кажется смущенным: вы просите "оптимизированный" способ, но вы используете регулярное выражение, потому что это "самый простой". Кроме того, вы еще не сказали, как должны выглядеть «замаскированные» данные (не ожидайте, что я пересмотрю ваши требования с помощью регулярного выражения - вы можете найти регулярные выражения, которые легко написать, но никто не находит их легко читаемыми).

Если у вас есть требования к производительности, вам нужно определить их количественно. Если вы не можете определить его количественно, попробуйте кодировать его в 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>

, и я думаю, что выгодно отличается от вашего решения для регулярных выражений по всем показателям: производительность , удобочитаемость и прежде всего правильность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...