【问题标题】:Comparing string outputs between Azure Properties.ContentMD5 and Get-Filehash比较 Azure Properties.ContentMD5 和 Get-Filehash 之间的字符串输出
【发布时间】:2020-09-05 19:26:33
【问题描述】:

如何直接比较Get-FileHash的输出和Properties.ContentMD5的输出?


我正在整理一个 PowerShell 脚本,该脚本从我的系统中获取一些本地文件并将它们复制到 Azure Blob 存储容器。

文件每天都在变化,所以我在上传之前添加了检查文件是否已经存在于容器中。

我使用Get-FileHash读取本地文件:

$LocalFileHash = (Get-FileHash "D:\file.zip" -Algorithm MD5).Hash

这导致$LocalFileHash 持有这个:67BF2B6A3E6657054B4B86E137A12382

我使用此代码获取已传输到容器的 blob 文件的校验和:

$BlobFile = "Path\To\file.zip"
$AZContext = New-AZStorageContext -StorageAccountName $StorageAccountName -SASToken "<token here>"

$RemoteBlobFile = Get-AzStorageBlob -Container $ContainerName -Context $AZContext -Blob $BlobFile -ErrorAction Ignore 
if ($ExistingBlobFile) { 
    $cloudblob = [Microsoft.Azure.Storage.Blob.CloudBlockBlob]$RemoteBlobFile.ICloudBlob
    $RemoteBlobHash = $cloudblob.Properties.ContentMD5
}

$RemoteBlobHash 的值设置为Z78raj5mVwVLS4bhN6Ejgg==

没问题,我想,我就解密Base64字符串比较一下:

$output = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($RemoteBlobHash))

这给了我g�+j&gt;fWKK��7�#� 所以不能直接比较☹


This question 显示了一个类似泡菜的人,但考虑到他们本地 MD5 结果的格式,我认为他们没有使用Get-FileHash

我尝试过的其他事情:

  • UTF8 上方的 System.Text.Encoding 行更改为 UTF16 和 ASCII,这会更改输出,但不会更改为任何可识别的内容。
  • 尝试使用 GetBytes 看看是否有帮助:
$output = [System.Text.Encoding]::UTF8.GetBytes([System.Text.Encoding]::UTF16.GetString([System.Convert]::FromBase64String($RemoteBlobHash)))

注意:使用 md5sum 比较本地文件和下载的 file.zip 副本会得到与 Get-FileHash 相同的 MD5 字符串:67BF2B6A3E6657054B4B86E137A12382

提前谢谢你!

【问题讨论】:

    标签: powershell encoding hash md5 azure-blob-storage


    【解决方案1】:

    ContentMD5二进制 哈希值的 base64 表示,而不是生成的十六进制字符串 :)

    $md5sum = [convert]::FromBase64String('Z78raj5mVwVLS4bhN6Ejgg==')
    $hdhash = [BitConverter]::ToString($md5sum).Replace('-','')
    

    这里我们转换base64->二进制->十六进制


    如果您需要以其他方式执行此操作(即获取本地文件哈希,然后使用它在 Azure 中搜索 blob),您首先需要将十六进制字符串拆分为字节大小的块,然后将生成的字节数组转换为base64:

    $hdhash = '67BF2B6A3E6657054B4B86E137A12382'
    $bytes  = [byte[]]::new($hdhash.Length / 2)
    for($i = 0; $i -lt $bytes.Length; $i++){
      $offset = $i * 2
      $bytes[$i] = [convert]::ToByte($hdhash.Substring($offset,2), 16)
    }
    $md5sum = [convert]::ToBase64String($bytes)
    

     

    【讨论】:

    • 谢谢!这完美!二进制方面绝对是让我绊倒的东西。 ContentMD5 property 的 Microsoft 页面相当稀疏,这无济于事??
    • base64 字符串的长度泄露了它 - 不足以编码完整的十六进制字符串表示(32 个字符),但足够编码散列本身(16 个字节)
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2021-09-14
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多