.net PowerShell将文件MD5获取为base64字符串
我有以下生成文件MD5的base64字符串的.NET代码:.net PowerShell将文件MD5获取为base64字符串,.net,powershell,.net,Powershell,我有以下生成文件MD5的base64字符串的.NET代码: using (FileStream fileStream = new FileStream(fileName, FileMode.Open)) { using (MD5 md5 = MD5.Create()) { using (CryptoStream cryptoStream = new CryptoStream((Stream) fileStream, (ICryptoTransform) md5,
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:\temp\test.txt"
$fileHashMD5 = Get-FileHash $uploadFilePath -Algorithm MD5
$bytes = [System.Text.Encoding]::ASCII.GetBytes($fileHashMD5.Hash)
$fileHashBase64 =[Convert]::ToBase64String($bytes)
但这返回的结果与上面生成的结果不同
我在PS脚本中做错了什么?最后编写了以下函数,模仿.NET函数的功能:
function Calc-File-Hash($filename) {
Using-Object($fileStream = new-object System.IO.FileStream("C:\temp\test.txt", [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)
}
}
}
使用对象
函数取自以下帖子:
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输出。您已经用
Get FileHash$uploadFilePath-算法MD5获得了哈希值。问题在于代码的其余部分-哈希是字节的十六进制表示。获取该字符串的7位US-ASCII表示返回完全不同的字节。您正在使用7位US-ASCII将十六进制字符串转换为与该十六进制字符串完全不匹配的字节。顺便说一句,.NET代码也很奇怪。您可以与流一起使用,无需在循环中读取数据。您可以只编写var bytes=md5.ComputeHash(fileStream)代码>@PanagiotisKanavos尝试过-仍然给出不同的结果干什么?你尝试了什么,得到了什么?问题中的代码肯定是错误的<代码>获取文件哈希
未断开仍然给出不同的结果
表示十六进制字符串不同。是吗?如果不是,则需要修复将一种字符串格式转换为另一种字符串格式的代码为什么不按原样使用十六进制字符串?Git哈希是十六进制字符串,而不是Base64。这与问题代码显示的错误相同——哈希是十六进制字符串。使用编码无法获取十六进制字符串的值