Есть ли регулярное выражение, доступное для определения, закодирована ли строка в base64 или нет в java? - PullRequest
0 голосов
/ 22 октября 2018

Я прошел несколько дискуссий, чтобы узнать, как это сделать.Но не найдено ни одного точного решения для этого.Я использовал следующее регулярное выражение, чтобы проверить, закодирована ли строка в Base64 или нет

^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$  

Но это не всегда верно.Я знаю, что могу использовать метод try catch.Но это дорогая операция для Java.Есть ли точный способ сделать это?Я использую Java 7.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Рендеринг base64 для любой данной строки - это просто еще одна строка, состоящая из алфавита из 64 токенов.Может ли строка быть проверена на регулярное выражение, чтобы она состояла только из токенов данного алфавита?Да.Означает ли это, что такая строка действительно является результатом преднамеренного кодирования base64?Нет. Также обратите внимание, что сам факт того, что он состоит только из алфавита из 64 токенов, не означает, что он является допустимой кодировкой base64 какой-либо другой строки.Из-за проблем длины строки и возможного заполнения, а также того, как с ней справляются, может случиться или не случиться так, что строка «a» сама по себе не является допустимой кодировкой base64 для чего-либо, даже если алфавит, из которого она состоит, может предложитьв противном случае.

«Попытка обнаружить по фактическому контенту» - это, как правило, очень плохая (потому что крайне подвержена ошибкам) ​​стратегия.Избегайте по возможности.

0 голосов
/ 22 октября 2018

Я бы посоветовал с осторожностью.Есть две проблемы:

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

(Можно избежать обратного отслеживания, используя «неохотные» или «притяжательные» квантификаторы, а не «жадные» квантификаторы, но вы должны понимать,что вы делаете.)

Тем не менее, если строка не короткая, вероятно, будет более эффективно попытаться декодировать base64 с использованием метода Base64.Decoder::decode и перехватить возможное исключение, чем использовать регулярное выражениепроверить.И у вас есть потенциальный бонус, что у вас есть декодированные данные.

(Возможно, в качестве ускорения вы могли бы проверить первые 4 и последние 4 символа перед попыткой полного декодирования base64.)


Вторая проблема заключается в том, что (теоретически) строка может быть синтаксически допустимой как Base64, но она была получена другим «процессом».Таким образом, когда вы декодируете строку, вы можете получить мусор.Поэтому, возможно, стоит расшифровать строку и проверить, что внутри ... как часть вашей проверки.


Я знаю, что могу использовать некоторый метод try catch.Но это дорогая операция для Java.

Все относительно.Кроме того, более новые JVM могут генерировать и обрабатывать исключения более эффективно благодаря некоторым оптимизациям, введенным (я думаю) в Java 8.

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