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 算法。

示例

示例 1:计算文件的哈希值

此示例使用 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

示例 2:计算 ISO 文件的哈希值

此示例使用 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

示例 3:计算流的哈希值

对于此示例,我们使用 System.Net.WebClientPowershell 发布页面下载程序包。 该发布页面还记录了每个程序包文件的 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

示例 4:计算字符串的哈希值

PowerShell 未提供用于计算字符串的哈希的 cmdlet。 但是,你可以将字符串写入到某个流,并使用 Get-FileHashInputStream 参数获取哈希值。

$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

参数

-Algorithm

指定加密哈希函数,以用来计算指定文件或流的内容的哈希值。 加密哈希函数具有以下特性:不可能找到具有相同哈希值的两个不同文件。 哈希函数通常与数字签名一起使用并用来保持数据的完整性。 此参数的可接受值为:

  • SHA1
  • SHA256
  • SHA384
  • SHA512
  • MACTripleDES
  • MD5
  • RIPEMD160

如果未指定任何值,或省略了参数,则默认值为 SHA256。

出于安全原因,MD5 和 SHA1(不再认为是安全的)仅应该用于简单的更改验证,而且不应该用于生成要求保护免受攻击或篡改的文件的哈希值。

类型:String
接受的值:SHA1, SHA256, SHA384, SHA512, MACTripleDES, MD5, RIPEMD160
Position:Named
默认值:SHA256
必需:False
接受管道输入:False
接受通配符:False

-InputStream

指定输入流。

类型:Stream
Position:Named
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-LiteralPath

指定到文件的路径。 与 Path 参数不同,LiteralPath 参数的值严格按照所键入的形式使用。 不会将任何字符解释为通配字符。 如果路径包括转义符,则请将其括在单引号中。 单引号会告知 PowerShell 不要将字符解释为转义序列。

类型:String[]
别名:PSPath
Position:Named
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-Path

以数组形式指定一个或多个文件的路径。 允许使用通配符。

类型:String[]
Position:0
默认值:None
必需:True
接受管道输入:False
接受通配符:True

输入

String

可以通过管道将包含文件路径的字符串传递给此 cmdlet。

输出

Microsoft.PowerShell.Utility.FileHash

此 cmdlet 返回一个对象,它表示指定文件的路径、计算出的哈希的值以及用于计算哈希的算法。