共用方式為


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-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
  • MD5

若未指定值,或省略參數,則預設值是 SHA256。

基於安全性理由,MD5 與 SHA1 (不再被視為安全) 只應該用於簡單的變更驗證,而不應該用於為需要保護以避免受攻擊或遭竄改的檔案產生雜湊值。

Type:String
Accepted values:SHA1, SHA256, SHA384, SHA512, MD5
Position:1
Default value:None
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

您可以使用管線將字串傳送至 Get-FileHash Cmdlet,其中包含一或多個檔案的路徑。

輸出

Microsoft.PowerShell.Utility.FileHash

Get-FileHash 會傳回 物件,此物件表示指定檔案的路徑、計算哈希的值,以及用來計算哈希的演算法。