【问题标题】:Is there any regular expression available to identify whether a string is base64 encoded or not in java?是否有任何正则表达式可用于识别字符串是否在 java 中是 base64 编码的?
【发布时间】:2018-10-22 05:59:54
【问题描述】:

我进行了多次讨论以了解如何执行此操作。但没有找到任何确切的解决方案。我使用以下正则表达式来检查字符串是否是 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。

【问题讨论】:

  • 检查正则表达式是否匹配可能与首先解码 base64 文本一样昂贵,甚至更多。
  • 感谢维克兰特·卡什亚普。它工作得更好。但是如果在加密字符串的末尾没有 = 符号就会有问题。

标签: java regex encryption base64


【解决方案1】:

我建议谨慎行事。有两个问题:

第一个问题是,当字符串不匹配时,您向我们展示的正则表达式可能会出现性能问题。特别是,在匹配失败之前,您会得到很多不必要的回溯。

(可以通过使用“不情愿”或“占有”量词而不是“贪婪”量词来避免回溯,但您需要了解自己在做什么。)

即便如此,除非字符串很短,否则尝试使用 Base64.Decoder::decode 方法进行 base64 解码并捕获可能的异常可能比使用正则表达式进行验证更有效。而且你有潜在的好处是你有解码的数据。

(也许作为加速,您可以在尝试完整的 base64 解码之前检查前 4 个和后 4 个字符。)


第二个问题是(理论上)字符串可能在语法上作为 Base64 有效,但它是由另一个“进程”生成的。因此,当您解码字符串时,您可能会得到垃圾。因此,作为验证的一部分,可能值得解码字符串并检查里面的内容。


我知道我可以使用一些 try catch 方法。但这对 java 来说是昂贵的操作。

这都是相对的。此外,由于(我认为)Java 8 中引入了一些优化,较新的 JVM 可以更有效地抛出和处理异常。

【讨论】:

  • +1 第二点比第一点多。由于 Base64 只是上下字母加上两个符号(取决于类型),因此可能会出现虚假解码。
【解决方案2】:

任何给定字符串的 base64 呈现只是另一个由 64 个标记的字母组成的字符串。可以正则表达式检查字符串是否仅包含给定字母表的标记?是的。这是否意味着这样的字符串确实是故意 base64 编码的结果?不。还要注意,仅由 64 个标记组成的字母表这一事实并不意味着它是其他字符串的合法 base64 编码。由于字符串长度和可能的填充以及处理方式的问题,字符串“a”本身可能不是任何东西的有效base64编码,即使它包含的字母表可能暗示否则。

“尝试从实际内容中检测”通常是一种非常糟糕的策略(因为完全容易出错)。尽可能避免。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2011-08-08
    • 2019-06-17
    • 2011-12-27
    相关资源
    最近更新 更多