Get-FileHash

使用指定的哈希演算法計算檔案的哈希值。

Syntax

Get-FileHash
   [-Path] <String[]>
   [[-Algorithm] <String>]
   [<CommonParameters>]
Get-FileHash
   [-LiteralPath] <String[]>
   [[-Algorithm] <String>]
   [<CommonParameters>]
Get-FileHash
   [-InputStream] <Stream>
   [[-Algorithm] <String>]
   [<CommonParameters>]

Description

Cmdlet Get-FileHash 會使用指定的哈希演算法來計算檔案的哈希值。 哈希值是對應至檔案內容的唯一值。 哈希會將唯一值指派給檔案的內容,而不是依檔案的檔名、擴展名或其他指定來識別檔案的內容。 您可以變更檔名和擴展名,而不需要變更檔案的內容,也不需要變更哈希值。 同樣地,您可以變更檔案的內容,而不需變更名稱或擴展名。 不過,即使變更檔案內容中的單一字元,也會變更檔案的哈希值。

哈希值的目的是提供密碼編譯安全的方式,以確認檔案的內容尚未變更。 雖然某些哈希演算法,包括 MD5 和 SHA1,不再被視為安全不受攻擊,但安全哈希演算法的目標是要使檔案的內容無法變更 -- 無論是意外的,還是惡意或未經授權的嘗試 -- 並維護相同的哈希值。 您也可以使用哈希值來判斷兩個不同的檔案是否完全相同的內容。 如果兩個檔案的哈希值相同,則檔案的內容也相同。

根據預設, Get-FileHash Cmdlet 會使用 SHA256 演算法,不過可以使用目標操作系統所支援的任何哈希演算法。

範例

範例 1:計算檔案的哈希值

此範例會 Get-FileHash 使用 Cmdlet 來計算檔案的 /etc/apt/sources.list 哈希值。 使用的哈希演算法是預設 SHA256。 輸出會以管線傳送至 Format-List Cmdlet,以將輸出格式化為清單。

Get-FileHash /etc/apt/sources.list | Format-List

Algorithm : SHA256
Hash      : 3CBCFDDEC145E3382D592266BE193E5BE53443138EE6AB6CA09FF20DF609E268
Path      : /etc/apt/sources.list

範例 2:計算 ISO 檔案的哈希值

此範例會使用 Get-FileHash Cmdlet 和 SHA384 演演算法來計算系統管理員從因特網下載之 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-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

參數

-Algorithm

指定用於計算指定檔案或數據流內容的哈希值的密碼編譯哈希函式。 密碼編譯哈希函式具有屬性,無法找到具有相同哈希值的兩個不同檔案。 哈希函式通常用於數位簽名和數據完整性。 此參數可接受的值為:

  • SHA1
  • SHA256
  • SHA384
  • SHA512
  • MD5

如果未指定任何值,或省略 參數,則預設值為SHA256。

基於安全性考慮,不再被視為安全的 MD5 和 SHA1 應該只用於簡單變更驗證,而且不應該用於產生需要保護免於攻擊或竄改之檔案的哈希值。

Type:String
Accepted values:SHA1, SHA256, SHA384, SHA512, MD5
Position:1
Default value:SHA256
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputStream

指定輸入數據流。

Type:Stream
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-LiteralPath

指定檔案的路徑。 不同於Path參數,LiteralPath 參數的值會與輸入時完全相同。 不會將任何字元解譯為通配符。 如果路徑包含逸出字元,請以單引弧括住路徑。 單引號會指示PowerShell不要將字元解譯為逸出序列。

Type:String[]
Aliases:PSPath, LP
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Path

將一或多個檔案的路徑指定為數位。 允許通配符。

Type:String[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:True

輸入

String

您可以使用管線將包含檔案路徑的字串傳送至此 Cmdlet。

輸出

Microsoft.PowerShell.Utility.FileHash

這個 Cmdlet 會傳回物件,代表指定檔案的路徑、計算哈希的值,以及用來計算哈希的演算法。