計算檔案雜湊碼 - 使用 PowerShell 及 Windows 內建工具
2 |
最近屢屢遇到需要檢查檔案 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, 感謝分享,已加入本文。