【问题标题】:Powershell Base64 decoding - irregular behaviorPowershell Base64 解码 - 不规则行为
【发布时间】:2019-11-22 11:16:17
【问题描述】:

我在 Powershell 中解码 base64 字符串时发现了一个奇怪的问题。

$url = "https://*******.search.windows.net/indexes/azureblob-index/docs?api-version=2019-05-06&search=*"

$headers = @{
    "api-version" = "2019-05-06"
    "Content-Type" = "application/json"
    "api-key" = "**********"
}

$result = Invoke-webrequest -Uri $url -Headers $headers -Method Get | ConvertFrom-Json 

$values = $result.value

foreach ($value in $values)            
  {
  $path = $value.metadata_storage_path
  $bloburl = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($path))
  $bloburl
  }

很明显,****隐藏了敏感信息。

所以我试图返回一个已编码的 Azure blob URL。它设法解码,但是,它返回并出错,并且似乎在 URL 的末尾添加了一个字符 - 使其与 base64 解码所期望的不同步。

结果看起来像这样 -

https://*******.blob.core.windows.net/files/REPORTS/*****/SEISMIC_ACQUISITION/ACQUISITION_REPORT_APPENDIX4_DAY_LOGS_JD_201.pdf5 

总是在字符串末尾添加一个数字 5。

关于这里发生了什么的任何想法?

这是完整的代码 - 没有其他内容。

正在发生的所有事情都是向 Azure 搜索发送搜索查询并返回与搜索查询匹配的 blob/文档的 url。 Azure 返回一个 base64 字符串,我想将其解码为纯可读文本。

错误是:

Exception calling "FromBase64String" with "1" argument(s): "Invalid length for a Base-64 char array or string."
At line:25 char:9
+         $bloburl = [System.Text.Encoding]::UTF8.GetString([System.Con ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException

它出现在从 base64 转换的那一行。

【问题讨论】:

  • 所以听起来 web-request 响应返回的字符串不是有效的 Bae64 编码字符串,或者,正如结果所示,它可能包含的不仅仅是这样的字符串。文档对这些数据的格式有什么看法?除了无关的 5 之外,返回的 URL 是您所期望的吗?
  • 当我使用在线 base64 解码器时,我得到了预期的 URL,因此它在转换时似乎在某处出现错误。有趣的是,如果我在转换之前将“=”添加到字符串的末尾,它会更正输出 URL,但随后会为我正在转换的其他字符串抛出相同的“无效长度”错误。它是如此随机。一个错误?
  • 结果是否包含非 ASCII 字符?会不会是字符编码问题(Invoke-WebRequest 误解了源编码)?
  • 您能否创建一个表现出相同行为的非敏感实例并针对此发布Invoke-webrequest -Uri $url -Headers $headers -Method Get 的原始结果?使用示例响应来诊断问题会更容易......
  • 另外,您可以尝试将 expected 值转换回 base64 并查看是否得到与 api 返回的相同的 base64 字符串 - 这可能会提供有关差异...

标签: azure powershell search encoding base64


【解决方案1】:

metadata_storage_path“base64 编码”值显然是 base64 的 ma​​ngled 版本,其中删除了任何尾随“=”,并放置一个数字表示删除了多少“=”。这是为了让 base64 字符串在 url 中更容易使用。

查看这个问题了解更多详情:

How to decode metadata_storage_path produced by Azure Search indexer in .NET Core

在解码之前,您需要补偿此修改以返回有效的 base64 编码字符串。链接的答案提供了一些如何执行此操作的选项。

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2017-07-24
    • 2019-04-15
    相关资源
    最近更新 更多