如何在 PowerShell 中获取 MD5 校验和
- 在 PowerShell 中使用 MD5 哈希算法
-
在 PowerShell 中使用
[System.Security.Cryptography.MD5]类 -
在 PowerShell 中使用
MD5CryptoServiceProvider类 - 结论
在确保 PowerShell 中数据完整性和安全性方面,MD5 哈希算法仍然是一个有价值的工具,尽管在安全上下文中的相关性有所下降。尽管由于存在漏洞不推荐用于密码学目的,但 MD5 仍然在验证文件传输和检测篡改方面有用。
利用 PowerShell 的能力,我们探索了计算 MD5 校验和的各种方法,提供了基础和高级方法的见解。
在 PowerShell 中使用 MD5 哈希算法
即使 MD5 不推荐用于安全,但它仍然是检查文件传输是否被篡改或成功的绝佳解决方案。
首先,在传输之前和之后获取文件的 MD5 指纹。
如果结果相同,文件传输未被篡改。如果不同,则文件已损坏。
为此,我们将使用 Get-FileHash cmdlet。Get-FileHash cmdlet 显示文件的哈希值。
默认情况下,它使用 SHA256 算法,但我们可以添加额外的参数以使用 MD5。
Get-FileHash [-Path] <file> [[-Algorithm] <algo>] [Options]
-Algorithm:指定要使用的哈希算法。在这种情况下,我们使用MD5。-Path:指定要计算哈希值的文件路径。
我们也可以使用它与流而不是文件路径。
Get-FileHash [-InputStream] <stream> [[-Algorithm] <algo>] [Options]
-
[-InputStream] <stream>:指定哈希计算的输入流,默认为-Path指定的文件。 -
[[-Algorithm] <algo>]:指定要使用的哈希算法(例如MD5、SHA1)。 -
[Options]:其他设置,如-Path、-LiteralPath、-Force等,用于自定义和错误处理。
这是一个示例:
Get-FileHash -Path "path\example.txt" -Algorithm MD5
在这段代码中,我们使用 Get-FileHash cmdlet 计算位于 "C:\Path\To\File.txt" 的文件的 MD5 校验和。该 cmdlet 自动计算指定文件的 MD5 哈希值。
输出:

-Path 参数不是必需的,因此我们不需要使用它。相反,我们给出文件路径并添加算法参数以使用 MD5 而不是 SHA256。
在脚本中使用 PowerShell,我们可以创建一个变量来保存结果,并通过哈希属性获取哈希值,例如 $variable.Hash,以确保它与原始文件的值相同。
在 PowerShell 中对字符串进行哈希
不幸的是,在 PowerShell 中没有直接的函数或原生命令可以从字符串生成哈希。
但是,可以使用带有流参数的 Get-FileHash,因此可以计算字符串的哈希是一种解决方案。
让我们直接从下面的代码片段开始:
$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$writer.write("MD5Online")
$writer.Flush()
$stringAsStream.Position = 0
Get-FileHash -InputStream $stringAsStream -Algorithm MD5
在这个代码片段中,我们创建了一个 MemoryStream 对象 $stringAsStream 并初始化一个 StreamWriter $writer 将字符串 MD5Online 写入流中。然后我们刷新写入器以确保数据写入流中。
在将流的位置设置回开始后,我们利用 Get-FileHash cmdlet,-InputStream 参数设置为 $stringAsStream,-Algorithm 参数设置为 MD5。该命令计算所提供字符串的 MD5 校验和。
输出:

与本文第一部分相比,唯一的变化是我们使用了 -InputStream 而不是 -Path。
正如您在输出中看到的,我们得到了字符串的 MD5 哈希作为结果。
在 PowerShell 中使用 [System.Security.Cryptography.MD5] 类
[System.Security.Cryptography.MD5] 类提供了计算数据的 MD5 哈希值的功能。该类是 .NET Framework 加密命名空间的一部分,为在 PowerShell 脚本中生成 MD5 校验和提供了强大而高效的解决方案。
[System.Security.Cryptography.MD5] 类提供了一个名为 ComputeHash() 的方法来计算 MD5 哈希值。语法如下:
$md5 = [System.Security.Cryptography.MD5]::Create()
$hash = $md5.ComputeHash($data)
$md5:表示使用Create()方法创建的 MD5 类的实例。$hash:存储计算出的 MD5 哈希值。$data:指定需要计算 MD5 校验和的数据。这可以是表示文件内容的字节数组或字符串。
这是一个示例:
$data = [System.Text.Encoding]::UTF8.GetBytes("MD5Example")
$md5 = [System.Security.Cryptography.MD5]::Create()
$hash = $md5.ComputeHash($data)
$hashString = [System.BitConverter]::ToString($hash) -replace '-', ''
Write-Output $hashString
在这个代码片段中,我们使用 [System.Text.Encoding]::UTF8.GetBytes() 将字符串 MD5Example 转换为字节数组。然后,我们使用 [System.Security.Cryptography.MD5]::Create() 创建一个 MD5 类的实例,并调用 ComputeHash() 方法生成所提供数据的 MD5 哈希值。
最后,我们使用 [System.BitConverter]::ToString() 将哈希值转换为字符串格式,并使用 -replace 运算符移除输出中的任何破折号。
输出:

在 PowerShell 中使用 MD5CryptoServiceProvider 类
MD5CryptoServiceProvider 类是 .NET Framework 加密命名空间的一部分。该类提供使用 MD5 加密算法计算数据的 MD5 哈希值的功能。
MD5CryptoServiceProvider 类提供了一个名为 ComputeHash() 的方法来计算 MD5 哈希值。语法如下:
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = $md5.ComputeHash($data)
$md5:表示使用New-Object创建的MD5CryptoServiceProvider类的实例。$hash:存储计算出的 MD5 哈希值。$data:指定需要计算 MD5 校验和的数据。这可以是表示文件内容的字节数组或字符串。
这是一个示例:
$data = [System.Text.Encoding]::UTF8.GetBytes("MD5Example")
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = $md5.ComputeHash($data)
$hashString = [System.BitConverter]::ToString($hash) -replace '-', ''
Write-Output $hashString
在这个代码片段中,我们使用 [System.Text.Encoding]::UTF8.GetBytes() 将字符串 MD5Example 转换为字节数组。然后,我们使用 New-Object 创建 MD5CryptoServiceProvider 类的实例,并调用 ComputeHash() 方法生成所提供数据的 MD5 哈希值。
最后,我们使用 [System.BitConverter]::ToString() 将哈希值转换为字符串格式,并使用 -replace 运算符移除输出中的任何破折号。
输出:

结论
PowerShell 提供了多种计算 MD5 校验和的途径,每种途径适用于不同的场景和复杂程度。无论是使用内置 cmdlet,如 Get-FileHash,还是利用 .NET 类的强大功能,如 System.Security.Cryptography.MD5,或者使用加密提供者,如 MD5CryptoServiceProvider,PowerShell 用户都可以使用多种工具来确保数据完整性和安全性。
通过有效理解和利用这些方法,PowerShell 脚本可以自信地精确可靠地处理需要 MD5 校验和的任务。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn