PowerShell获取文件MD5作为base64字符串



我有以下.NET代码,用于生成文件MD5:的base64字符串

using (FileStream fileStream = new FileStream(fileName, FileMode.Open))
{
using (MD5 md5 = MD5.Create())
{
using (CryptoStream cryptoStream = new CryptoStream((Stream) fileStream, (ICryptoTransform) md5, CryptoStreamMode.Read))
{
byte[] buffer = new byte[4096];
do
;
while (cryptoStream.Read(buffer, 0, buffer.Length) > 0);
return Convert.ToBase64String(md5.Hash);
}
}
}

这是工作代码的一部分。

现在我需要创建一个PowerShell脚本,它可以进行一些自动化操作,还需要创建相同的base64哈希文件。我写了以下内容:

$uploadFilePath = "C:temptest.txt"
$fileHashMD5 = Get-FileHash $uploadFilePath -Algorithm MD5
$bytes = [System.Text.Encoding]::ASCII.GetBytes($fileHashMD5.Hash)
$fileHashBase64 =[Convert]::ToBase64String($bytes)

但这返回的结果与上面生成的结果不同。

我在PS脚本中做错了什么?

MD5字符串的大小写有区别吗?举个例子:

> [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("string to encode".ToLower()))
> c3RyaW5nIHRvIGVuY29kZQ==
> [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("string to encode".ToUpper()))
> U1RSSU5HIFRPIEVOQ09ERQ==

相同的字符串但不同的base64输出。

最终编写了以下模拟.NET函数的函数:

function Calc-File-Hash($filename) {
$filename = resolve-path $filename
Using-Object($fileStream = new-object System.IO.FileStream($filename, [System.IO.FileMode]::Open)) {
Using-Object($md5 = [System.Security.Cryptography.MD5]::Create()) {
$cryptoStream = new-object System.Security.Cryptography.CryptoStream($fileStream, $md5, [System.Security.Cryptography.CryptoStreamMode]::Read)
$buffer = [System.Byte[]]::new(4096)
do {

}
while ($cryptoStream.Read($buffer, 0, $buffer.Length) -gt 0)
return [Convert]::ToBase64String($md5.Hash)
}
}
}

Using-Object函数取自以下帖子:如何在powershell中实现using语句?

最新更新