Get-FileHash
使用指定的哈希演算法計算檔案的哈希值。
語法
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.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 來計算字串的哈希。 不過,您可以將字串寫入數據流,並使用的 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 應該只用於簡單變更驗證,而且不應該用於產生需要保護免於攻擊或竄改之檔案的哈希值。
類型: | String |
接受的值: | SHA1, SHA256, SHA384, SHA512, MD5 |
Position: | 1 |
預設值: | SHA256 |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-InputStream
指定輸入數據流。
類型: | Stream |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | False |
接受萬用字元: | False |
-LiteralPath
指定檔案的路徑。 不同於Path參數,LiteralPath 參數的值會與輸入時完全相同。 不會將任何字元解譯為通配符。 如果路徑包含逸出字元,請以單引弧括住路徑。 單引號會指示PowerShell不要將字元解譯為逸出序列。
類型: | String[] |
別名: | PSPath, LP |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | True |
接受萬用字元: | False |
-Path
將一或多個檔案的路徑指定為數位。 允許通配符。
類型: | String[] |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | True |
接受萬用字元: | True |
輸入
您可以使用管線將包含檔案路徑的字串傳送至此 Cmdlet。
輸出
Microsoft.PowerShell.Utility.FileHash
這個 Cmdlet 會傳回物件,代表指定檔案的路徑、計算哈希的值,以及用來計算哈希的演算法。