比较 Azure Properties.ContentMD5 和 Get-Filehash 之间的字符串输出。

问题描述 投票:0回答:1

我如何比较 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>fWKK��7�#� 所以不能直接比较"■▄▄■▓。


这个问题 显示有人陷入了类似的困境,但我不认为他们使用的是 Get-FileHash 鉴于他们本地MD5结果的格式。

其他的事情我也试过了。

  • 修改上面的System.Text.Encoding行。UTF8 到UTF16 & ASCII,这改变了输出,但没有任何可识别的东西。
  • 试试用GetBytes看看是否有帮助。
$output = [System.Text.Encoding]::UTF8.GetBytes([System.Text.Encoding]::UTF16.GetString([System.Convert]::FromBase64String($RemoteBlobHash)))

注意: 使用 md5sum 来比较本地文件和下载的 file.zip 副本的结果是相同的 MD5 字符串作为 Get-FileHash:67BF2B6A3E6657054B4B86E137A12382。

先谢谢您了!

powershell encoding hash md5 azure-blob-storage
1个回答
1
投票

ContentMD5 是一个base64表示的 二进制 哈希值,而不是结果的十六进制字符串:)

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

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


如果需要反过来做(即获取本地文件哈希,然后用它来搜索 Azure 中的 blobs),首先需要将十六进制字符串分割成字节大小的块,然后将得到的字节数组转换为 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)
© www.soinside.com 2019 - 2024. All rights reserved.