最近屢屢遇到需要檢查檔案 Hash 的場合:(對,就是前幾天講密碼儲存提到的 MD5、SHA256)

  • 修正部落檔圖檔上傳問題,手動補資料時需算出 MD5 (例如:YGiBMSb7ZIV0vob+bAB/9g==)
  • 防毒軟體提供了某檔案的 SHA1 (例如:66b6158b28cc2b970e454b6a8cf1824dd99e4029),我想確認跟手上檔案是否吻合

有 PowerShell 在手,這是小事,一行就能搞定:

[Convert]::ToBase64String([Security.Cryptography.MD5]::Create().ComputeHash((Get-Content Fig1.jpg -Encoding Byte -ReadCount 0)))

[BitConverter]::ToString([System.Security.Cryptography.SHA1]::Create().ComputeHash((Get-Content notepad.exe -Encoding Byte -ReadCount 0))).Replace('-','').ToLower()

補充小技巧:Get-Content filePath -Encoding Byte -ReadCount 0 可取得檔案內容 byte[],相當於 File.ReadAllBytes(),但不用擔心 .NET 與 PowerShell 工作目錄不同步問題。延伸閱讀:PowerShell 與 .NET 的工作目錄差異

[2021-10-19 更新] 我繞遠路了,其實 PowerShell 有現成 Cmdlet - Get-FileHash 一氣喝成,感謝讀者 Jimmy 分享。補充:關於 6068813126fb648574be86fe6c007ff6 轉 YGiBMSb7ZIV0vob+bAB/9g==,我在 Stackoverflow 找到一個巧妙寫法,用 -split '(.{2})' -ne '' -replace '^','0X' 可將 16 進位數字串轉成 [byte[]],之後再用 Convert.ToBase64String() 轉換。

[Convert]::ToBase64String([byte[]]((Get-FileHash .\Fig1.jpg -Algorithm MD5).Hash -split '(.{2})' -ne '' -replace '^','0X'))

(Get-FileHash .\notepad.exe -Algorithm SHA1).Hash

如果不想寫程式,Windows 7+ 有內建工具可用 - Windows 10 (and 7) Built-In MD5 Checksum Calculator

certutil -hashfile 檔案路徑 MD5
certutil -hashfile 檔案路徑 SHA1

certutil -hashfile -? 可查詢 certutil 支援的雜湊演算法,包含 MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512 七種。至於如何將 6068813126fb648574be86fe6c007ff6 轉成 YGiBMSb7ZIV0vob+bAB/9g== 這種 Base64 結果,如果不嫌麻煩,certutil 也可辦到,方法是將 16 進位數字存成檔案用 -decodehex 轉二進位,再 -encode 轉 Base64:

好像太搞剛了點,用 PowerShell 比較省事。

Example of how to compute file hash in Windows with PowerShell and certutil utility.


Comments

# by Jimmy

PowerShell 有內建 Get-FileHash 可以使用,不需要 .NET。

# by Jeffrey

to Jimmy, 感謝分享,已加入本文。

Post a comment