Windows 命令提示字元可以在不額外安裝軟體的情況下產生 SHA-256 雜湊值:開啟 cmd.exe,執行 certutil -hashfile "path\to\file" SHA256,然後從輸出中複製 64 個字元的十六進位摘要。SHA-256 是由 NIST FIPS 180-4 規範的 SHA-2 家族中的 256 位元成員,同樣的演算法也可以從 PowerShell、近期 Windows 10 與 11 版本的檔案總管「檔案雜湊」右鍵選單,以及像 SHA256 雜湊產生器 這類的瀏覽器工具取得。CMD 這條路徑之所以重要,是因為腳本、建置管線和下載驗證步驟在許多機器上仍然從普通的命令提示字元執行,而且內建指令可以避免在鎖定的工作站上安裝第三方工具。輸出永遠是固定的 32 位元組摘要,以 64 個十六進位字元表示,作為所讀取確切位元組的一個具決定性的單向指紋。相同的輸入位元組會產生相同的摘要;多一個空格或換行就會改變指紋,這就是為什麼有時候 CMD 輸出看起來不對,即使兩端執行的是同一個演算法。

「在 Windows CMD 中產生 SHA256 雜湊」實際上的意思
這個任務是將一個檔案或字串餵入 SHA-256 演算法,並讀回一個具決定性的 256 位元摘要。摘要每次執行、每台機器、每個作業系統上都相同,前提是輸入位元組完全一致。困難的部分在位元組層級:空格、歸位字元、行尾符號以及 UTF-8 編碼選擇都會成為輸入的一部分,所以相同的邏輯文字在底層位元組不同時會產生不同的摘要。RFC 6234 以 SHA-256 這個名稱記載了同一個演算法,是跨平台互通的參考依據。
實務上,CMD 工作流程中會出現兩種輸入形式。第一種是磁碟上的檔案:ISO、安裝程式、發行 zip 檔。第二種是簡短的文字片段,例如權杖、建置識別碼或命令字串,有人想為它取一個快速的指紋。CMD 直接以 CertUtil 處理第一種情況;第二種情況則多數使用者會將文字透過 PowerShell 管線傳遞,或改用能同時接受文字與檔案的瀏覽器工具。
SHA-256 的內建 CMD 指令:CertUtil
CertUtil 隨每個受支援的 Windows 版本出貨,並透過 -hashfile 參數公開多種雜湊演算法。若要計算檔案的 SHA-256,請開啟 cmd.exe,切換到檔案所在資料夾,然後執行:
certutil -hashfile "C:\Users\you\Downloads\installer.msi" SHA256該指令會印出標頭、64 個十六進位字元的摘要(以空格分成四組),以及一行「CertUtil: -hashfile command completed successfully」結尾。輸出中的空格只是裝飾用;在貼到驗證腳本之前請先去除。演算法名稱不區分大小寫,因此 SHA256、sha256 和 Sha-256 都對應到同一個摘要運算。
PowerShell 也能用 Get-FileHash -Algorithm SHA256 "C:\path\to\file" 達到相同結果,且會輸出不帶空格的英文小寫十六進位。當腳本必須留在 .bat 檔中時,也可以從 CMD 以一行指令呼叫 PowerShell:
powershell -NoProfile -Command "Get-FileHash -Algorithm SHA256 'installer.msi' | Select-Object -ExpandProperty Hash"若輸入是文字而非檔案,PowerShell 的 [System.Security.Cryptography.SHA256]::ComputeHash 搭配 UTF-8 編碼器是常見的 CMD 替代做法。每多一個新行、前導空格或缺少 BOM 都會改變結果,因此位元組層級的精準驗證比使用檔案路徑更困難。
使用 SHA256 雜湊產生器產生 SHA-256
瀏覽器工具涵蓋了 CMD 處理起來較尷尬的情況:文字模式、Unicode 字元,以及在不打路徑的情況下快速比對廠商公布的校驗值。SHA256 雜湊產生器透過平台加密實作在當前瀏覽器分頁中執行相同的 FIPS 180-4 演算法,所選內容不會離開本機。步驟如下:
- 選擇與來源相符的文字或檔案輸入模式。
- 若是文字,請輸入或貼上完全相同的字串。工具會先將其編碼為 UTF-8,因此顯示的位元組數已反映帶有變音符號的字母、表情符號,或任何每個字元佔用超過一個位元組的非 ASCII 文字。
- 若是檔案,請選擇一個不超過 100 MB 的本機檔案。工具會逐位元組雜湊所選內容,包括檔頭與中繼資料,完全依照磁碟上的原始狀態。
- 讀取摘要。Hex 值是 64 個英文小寫字元;Base64 值是同一個 32 位元組的標準填補編碼。
- 複製接收端系統所要求的表示法,並貼到比對欄位或文字檔中。
- 以字元逐一比對完整摘要與經驗證的參考值。前綴相符不算相符。
作為已知的測試向量,空白字串(UTF-8 文字的零位元組)的 SHA-256 為 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,而同一個 32 位元組以 Base64 編碼則為 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=。任何對空輸入回報不同數值的工具,都在雜湊零位元組以外的東西。
為什麼 CMD 與瀏覽器工具的輸出可能不同
當兩個正確的 SHA-256 實作結果不一致時,問題幾乎從不是演算法,而是輸入位元組。下表列出 CMD 使用者在與廠商公布的摘要或瀏覽器工具比對時,最常見的不符情況。
| 現象 | 常見原因 | 修正方式 |
|---|---|---|
| 最後兩個十六進位字元錯誤 | 殼層或文字編輯器附加了結尾換行 | 去除結尾的換行,或改為檔案對檔案比對而非檔案對文字 |
| 「相同」字串的整個摘要不同 | 文字以 UTF-16 或 ANSI 字碼頁而非 UTF-8 進行雜湊 | 雜湊前將字串重新編碼為 UTF-8,並確認表情符號或變音符號能完整往返 |
| 貼上的文字再次輸入時摘要改變 | Unicode 正規化形式(NFC 對 NFD)或不可見字元 | 直接雜湊檔案位元組,或使用會同時顯示位元組數與摘要的工具 |
| CertUtil 輸出為大寫,工具輸出為小寫 | 十六進位表示法的大小寫 | 以不分大小寫方式比對;大小寫改變的只是呈現方式,並非底層摘要位元組 |
| 廠商的十六進位摘要只有 40 個字元 | 參考值是 SHA-1 而非 SHA-256 | 使用廠商實際公布的演算法重新計算,並將演算法名稱與該值一同儲存 |
不論摘要是來自 CertUtil、PowerShell 還是瀏覽器工具,同樣的位元組層級規則都適用。演算法是具決定性的,因此任何不符必定回溯到被雜湊的位元組之間的差異。
Hex 對 Base64:選擇對端所預期的表示法
每個 SHA-256 摘要都是 32 位元組。位元組的兩種編碼無處不在:64 個英文小寫的十六進位字元,以及 44 個包含一個 = 填補符的標準 Base64 字元。CertUtil 印出帶內部空格的十六進位;PowerShell 印出不帶空格的十六進位;SHA256 雜湊產生器則同時印出兩種形式,讓任一端都不必臨時轉換。兩種編碼代表的是同一個數字,因此改變呈現方式並不會改變底層摘要。若接收端系統預期 Base64,請貼上 Base64 值;若預期十六進位,則貼上十六進位值。即使摘要相同,混用兩者必定會驗證失敗。
若需要更廣泛的逐步說明,包含 PowerShell 與檔案總管的方式,請參閱關於 在 Windows 中產生 SHA256 雜湊 的配套指南;若想走 JavaScript 路線,使用瀏覽器工具背後相同的 Web Crypto API,JavaScript SHA-256 指南 涵蓋了對應的程式碼。
瀏覽器工具何時是更好的交叉驗證方式
即使 CMD 已產生腳本所需的摘要,將同一組位元組再丟進第二個獨立工具,是快速抓出位元組層級錯誤的好方法。瀏覽器工具特別適合這項工作,因為它在本機執行演算法,同時接受檔案與文字,並會在摘要旁顯示位元組數。以下三種情況特別適合將它作為交叉驗證:
- CMD 輸入是文字而非檔案。將相同字串貼到工具中並確認位元組數符合預期摘要的原像,比除錯 PowerShell 編碼器更快。
- 廠商公布的是 Base64 摘要。直接從工具複製可避免手動的十六進位對 Base64 轉換。
- 檔案小到落在 100 MB 上限之內,且使用者在禁止安裝工具的機器上想驗證下載。
對於超過 100 MB 的檔案,瀏覽器使用的 Web Cryptography 摘要介面接收的是完整的位元組緩衝而非串流,因此本機上的串流工具(例如內建的 Get-FileHash)是更安全的選擇。如同任何完整性檢查,比對的可信度完全取決於參考摘要本身。若攻擊者能同時置換檔案與檔案旁顯示的校驗值,那麼重新計算 SHA-256 只會確認攻擊者的那一組。請透過 HTTPS 從廠商已簽署的發行頁面取得參考雜湊、透過已簽署的發行構件,或透過其他適合該風險等級的經驗證通道。SHA-256 是沒有金鑰、也不存在支援的反向運算的單向函數,因此它能驗證位元組,卻無法單獨驗證來源;對此,HMAC-SHA-256 或數位簽章才是合適的原語。