Get-FileHash
使用指定的哈希算法计算文件的哈希值。
Get-FileHash
[-Path] <String[]>
[-Algorithm <String>]
[<CommonParameters>]
Get-FileHash
-LiteralPath <String[]>
[-Algorithm <String>]
[<CommonParameters>]
Get-FileHash
-InputStream <Stream>
[-Algorithm <String>]
[<CommonParameters>]
Get-FileHash
cmdlet 使用指定的哈希算法计算文件的哈希值。
哈希值是对应于文件内容的唯一值。 哈希不按文件文件名、扩展名或其他指定来标识文件的内容,而是为文件的内容分配唯一值。 可以更改文件名和扩展名,而无需更改文件的内容,也无需更改哈希值。 同样,可以在不更改名称或扩展名的情况下更改文件的内容。 但是,即使在文件内容中更改单个字符也会更改文件的哈希值。
哈希值的目的是提供一种加密安全的方法来验证文件的内容是否已更改。 虽然某些哈希算法(包括 MD5 和 SHA1)不再被视为安全免受攻击,但安全哈希算法的目标是使无法更改文件的内容(无论是意外的还是恶意的或未经授权的尝试),并维护相同的哈希值。 还可以使用哈希值来确定两个不同的文件是否完全相同的内容。 如果两个文件的哈希值相同,则文件的内容也相同。
默认情况下,Get-FileHash
cmdlet 使用 SHA256 算法,尽管可以使用目标作系统支持的任何哈希算法。
此示例使用 Get-FileHash
cmdlet 计算 Powershell.exe
文件的哈希值。
使用的哈希算法是默认的 SHA256。 输出通过管道传递给 Format-List
cmdlet,以将输出格式化为列表。
Get-FileHash $PSHOME\powershell.exe | Format-List
Algorithm : SHA256
Hash : 908B64B1971A979C7E3E8CE4621945CBA84854CB98D76367B791A6E22B5F6D53
Path : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
此示例使用 Get-FileHash
cmdlet 和 SHA384 算法计算管理员从 Internet 下载的 ISO 文件的哈希值。 输出通过管道传递给 Format-List
cmdlet,以将输出格式化为列表。
Get-FileHash C:\Users\user1\Downloads\Contoso8_1_ENT.iso -Algorithm SHA384 | Format-List
Algorithm : SHA384
Hash : 20AB1C2EE19FC96A7C66E33917D191A24E3CE9DAC99DB7C786ACCE31E559144FEAFC695C58E508E2EBBC9D3C96F21FA3
Path : C:\Users\user1\Downloads\Contoso8_1_ENT.iso
在本示例中,我们将使用 System.Net.WebClient 从 Powershell 发布页下载包。 发布页还会记录每个包文件的 SHA256 哈希。 我们可以将已发布的哈希值与使用 Get-FileHash
计算的哈希值进行比较。
$wc = [System.Net.WebClient]::new()
$pkgurl = 'https://github.com/PowerShell/PowerShell/releases/download/v6.2.4/powershell_6.2.4-1.debian.9_amd64.deb'
$publishedHash = '8E28E54D601F0751922DE24632C1E716B4684876255CF82304A9B19E89A9CCAC'
$FileHash = Get-FileHash -InputStream ($wc.OpenRead($pkgurl))
$FileHash.Hash -eq $publishedHash
True
PowerShell 不提供用于计算字符串哈希的 cmdlet。 但是,可以将字符串写入流,并使用 Get-FileHash
的 InputStream 参数获取哈希值。
$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$writer.write("Hello world")
$writer.Flush()
$stringAsStream.Position = 0
Get-FileHash -InputStream $stringAsStream | Select-Object Hash
Hash
----
64EC88CA00B268E5BA1A35678A1B5316D212F4F366B2477232534A8AECA37F3C
指定用于计算指定文件或流内容的哈希值的加密哈希函数。 加密哈希函数具有属性,无法找到具有相同哈希值的两个不同的文件。 哈希函数通常用于数字签名和数据完整性。 此参数的可接受值为:
- SHA1
- SHA256
- SHA384
- SHA512
- MACTripleDES
- MD5
- RIPEMD160
如果未指定任何值,或者省略参数,则默认值为 SHA256。
出于安全原因,不再被视为安全的 MD5 和 SHA1 应仅用于简单更改验证,不应用于生成需要保护免受攻击或篡改的文件的哈希值。
类型: | String |
接受的值: | SHA1, SHA256, SHA384, SHA512, MACTripleDES, MD5, RIPEMD160 |
Position: | Named |
默认值: | SHA256 |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
指定输入流。
类型: | Stream |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
指定文件的路径。 与 Path 参数不同,LiteralPath 参数的值与类型化完全相同。 不会将任何字符解释为通配符。 如果路径包含转义字符,请将路径括在单引号中。 单引号指示 PowerShell 不要将字符解释为转义序列。
类型: | String[] |
别名: | PSPath |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
将一个或多个文件的路径指定为数组。 允许使用通配符。
类型: | String[] |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | True |
可以通过管道将包含文件路径的字符串传递给此 cmdlet。
Microsoft.PowerShell.Utility.FileHash
此 cmdlet 返回一个对象,该对象表示指定文件的路径、计算哈希的值以及用于计算哈希的算法。