Get-FileHash

利用指定的雜湊演算法計算檔案的雜湊值。

語法

Path (預設值)

Get-FileHash
    [-Path] <String[]>
    [[-Algorithm] <String>]
    [<CommonParameters>]

LiteralPath

Get-FileHash
    [-LiteralPath] <String[]>
    [[-Algorithm] <String>]
    [<CommonParameters>]

StreamParameterSet

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

Description

Get-FileHash指令小子透過指定的雜湊演算法計算檔案的雜湊值。 雜湊值是唯一對應檔案內容的值。 雜湊不是透過檔案名稱、副檔名或其他指定來識別檔案內容,而是為檔案內容指派一個唯一的值。 檔案名稱和副檔名可以在不改變檔案內容或雜湊值的情況下更改。 同樣地,檔案內容也可以在不改名稱或副檔名的情況下更改。 然而,即使只更改檔案內容中的一個字元,檔案的雜湊值也會改變。

雜湊值的目的是提供一種加密學上安全的驗證檔案內容是否被更改。 雖然包括 MD5 和 SHA1 在內的部分雜湊演算法已不再被視為對攻擊安全,但安全雜湊演算法的目標是讓檔案內容無法被更改——無論是意外、惡意或未經授權的嘗試——同時維持相同的雜湊值。 你也可以用雜湊值判斷兩個不同檔案的內容是否完全相同。 如果兩個檔案的雜湊值相同,檔案內容也相同。

預設情況下,指令 Get-FileHash 小程式使用 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.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

範例 4:計算字串的雜湊值

PowerShell 並未提供 cmdlet 來計算字串雜湊值。 不過,你可以寫一個字串到串流,並使用 InputStreamGet-FileHash 參數來取得雜湊值。

$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 已不再被視為安全,應僅用於簡單的變更驗證,且不應用於產生需要防攻擊或竄改保護的檔案的雜湊值。

參數屬性

類型:String
預設值:SHA256
接受的值:SHA1, SHA256, SHA384, SHA512, MD5
支援萬用字元:False
不要顯示:False

參數集

(All)
Position:1
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-InputStream

指定輸入串流。

參數屬性

類型:Stream
預設值:None
支援萬用字元:False
不要顯示:False

參數集

StreamParameterSet
Position:0
必要:True
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-LiteralPath

指定檔案的路徑。 與 Path 參數不同, LiteralPath 參數的值是完全按照其型別使用。 不會將任何字元解譯為通配符。 如果路徑包含跳脫字元,請用單引號包圍路徑。 單引號指示 PowerShell 不要將字元解讀為逃脫序列。

參數屬性

類型:

String[]

預設值:None
支援萬用字元:False
不要顯示:False
別名:PSPath, LP

參數集

LiteralPath
Position:0
必要:True
來自管線的值:False
來自管線按屬性名稱的值:True
來自剩餘引數的值:False

-Path

指定一個或多個檔案的路徑為陣列。 允許使用通配符字元。

參數屬性

類型:

String[]

預設值:None
支援萬用字元:True
不要顯示:False

參數集

Path
Position:0
必要:True
來自管線的值:True
來自管線按屬性名稱的值:True
來自剩餘引數的值:False

CommonParameters

此 cmdlet 支援常見參數:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 如需詳細資訊,請參閱 about_CommonParameters。

輸入

String

你可以將包含檔案路徑的字串管道傳送到這個 cmdlet。

輸出

Microsoft.PowerShell.Utility.FileHash

此 cmdlet 回傳一個物件,代表指定檔案的路徑、計算出的雜湊值,以及計算雜湊值所用演算法。