IT技術に関するメモ(主にセキュリティ関連)

Windowsでハッシュ値の求め方

本ブログ記事にはアフィリエイト広告を利用しています

ソフトウェアをダウンロードした時のハッシュ値確認や検体をVirusTotal等で検索する際にファイルのハッシュ値を求めるケースがあります。
会社で利用するパソコンの場合、勝手にソフトウェアを入れることが出来ないケースが多いので、Windows標準で求める方法を記載します。

なお、検証の環境はWindows 10 21H1にて実施しています。
Windowsバージョンによっては使用出来なかったり、PowerShell自体がグループポリシーで禁止されている事はあります。

PowerShellのGet-FileHashコマンド

PowerShellにGet-FileHashというコマンドがあります。

基本的な使い方

PowerShellを使うため、まずは[スタート]を右クリックします。

メニューが表示されるため、[Windows PowerShell(I)]をクリックします。

PowerShellが起動するので、Get-FileHash [ファイル名]と入力してEnterでハッシュ値が求められます。

PS C:\test> Get-FileHash .\hashtest.txt

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08       C:\test\hashtest.txt

Algorithmを指定しない場合はSHA256のハッシュ値となります。
指定可能なAlgorithmはSHA1, SHA256, SHA384, SHA512, MD5となっています。
Algorithmを指定する際はGet-FileHash -Algorithm [アルゴリズム] [ファイル名]といったコマンドになります。

PS C:\test> Get-FileHash -Algorithm SHA1 .\hashtest.txt

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA1            A94A8FE5CCB19BA61C4C0873D391E987982FBBD3                               C:\test\hashtest.txt

複数のファイルのハッシュ値を求める

複数のファイルや特定の拡張子のみハッシュ値を求めたい場合は「*」を使用します。
Get-FileHash * とすると、今いるフォルダ内のすべてのファイルが対象です。

PS C:\test> Get-FileHash *

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855       C:\test\hashtest.bmp
SHA256          9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08       C:\test\hashtest.txt
SHA256          4C716D4CF211C7B7D2F3233C941771AD0507EA5BACF93B492766AA41AE9F720D       C:\test\hogehoge.txt

特定の拡張子のハッシュ値を求める場合は、Get-FileHash *.txt とすることで.txtファイルを対象にハッシュ値を求める事が出来ます。

PS C:\test> Get-FileHash *.txt

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08       C:\test\hashtest.txt
SHA256          4C716D4CF211C7B7D2F3233C941771AD0507EA5BACF93B492766AA41AE9F720D       C:\test\hogehoge.txt

再帰的にハッシュ値を求める場合はGet-ChildItem -Recurse -File | Get-FileHash -Algorithm SHA1といったようにGet-ChildItemを使ってパイプで渡すと再帰的に見ることが出来ます。
サンプルでは再帰的にSHA1アルゴリズムでハッシュ値を求めています。

PS C:\test> Get-ChildItem -Recurse -File | Get-FileHash -Algorithm SHA1

Algorithm       Hash                                                               Path
---------       ----                                                               ----
SHA1            DA39A3EE5E6B4B0D3255BFEF95601890AFD80709                           C:\test\hashtest.bmp
SHA1            A94A8FE5CCB19BA61C4C0873D391E987982FBBD3                           C:\test\hashtest.txt
SHA1            3B2C6C10D0E78072D14E02CC4C587814D0F10F3A                           C:\test\hogehoge.txt
SHA1            250E77F12A5AB6972A0895D290C4792F0A326EA8                           C:\test\dir\banana.txt
SHA1            891307F2888254E7FC1E468762F10E5D480FE9A7                           C:\test\dir\mikan.txt

.txtファイルのみを再帰的に求めたいケースではGet-ChildItem -Recurse -File *.txt | Get-FileHash -Algorithm SHA1といったようにGet-ChildItemコマンドのオプションで対応しましょう。

PS C:\test> Get-ChildItem -Recurse -File *.txt | Get-FileHash -Algorithm SHA1
Algorithm       Hash                                                                Path
---------       ----                                                                ----
SHA1            250E77F12A5AB6972A0895D290C4792F0A326EA8                            C:\test\dir\banana.txt
SHA1            891307F2888254E7FC1E468762F10E5D480FE9A7                            C:\test\dir\mikan.txt
SHA1            A94A8FE5CCB19BA61C4C0873D391E987982FBBD3                            C:\test\hashtest.txt
SHA1            3B2C6C10D0E78072D14E02CC4C587814D0F10F3A                            C:\test\hogehoge.txt

certutil.exe

Get-FileHashコマンドとは別の手法として、certutil.exeを利用する方法があります。
certutil.exeは証明書サービスのために用意されているプログラムで、ファイルのハッシュ値を求める機能があります。

基本的な使い方

certutilを使用するためにコマンドプロンプトを立ち上げます。
[スタート]をクリックし、[Windows システム ツール]から[コマンドプロンプト]を選択します。

コマンドプロントにcertutil -hashfile [ファイル名]と入力してEnterでハッシュ値が求められます。

c:\test>certutil -hashfile hashtest.txt
SHA1 ハッシュ (対象 hashtest.txt):
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
CertUtil: -hashfile コマンドは正常に完了しました。

HashAlgorithmを指定しない場合はデフォルトでSHA1のハッシュ値となります。
指定可能なHashAlgorithmはMD2, MD4, MD5, SHA1, SHA256, SHA384, SHA512となっています。
HashAlgorithmを指定する際はcertutil -hashfile [ファイル名] [ハッシュアルゴリズム]といったコマンドになります。

c:\test>certutil -hashfile hashtest.txt SHA256
SHA256 ハッシュ (対象 hashtest.txt):
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
CertUtil: -hashfile コマンドは正常に完了しました。

複数のファイルのハッシュ値を求める

複数をまとめて求める場合はfor文を使用する必要がありますので、PowerShellを利用できる環境ではそちらを利用した方が良さそうです。
使用できない場合はfor %F in (*) do @certutil -hashfile "%F" SHA256といったコマンドで複数のファイルを対象にできます。

c:\test>for %F in (*) do @certutil -hashfile "%F" SHA256
SHA256 ハッシュ (対象 hashtest.png):
eb2cb719d02d94af5d2e4fff3618203061a421a2ba7463c65aff2272f08d53b7
CertUtil: -hashfile コマンドは正常に完了しました。
SHA256 ハッシュ (対象 hashtest.txt):
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
CertUtil: -hashfile コマンドは正常に完了しました。
SHA256 ハッシュ (対象 hogehoge.txt):
4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d
CertUtil: -hashfile コマンドは正常に完了しました。

.txtのみを対象としたい場合は(*)を(*.txt)とします。複数の拡張子を対象としたい場合は(*.txt, *.png)といった感じ変更してください。

c:\test>for %F in (*.txt) do @certutil -hashfile "%F" SHA256
SHA256 ハッシュ (対象 hashtest.txt):
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
CertUtil: -hashfile コマンドは正常に完了しました。
SHA256 ハッシュ (対象 hogehoge.txt):
4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d
CertUtil: -hashfile コマンドは正常に完了しました。

c:\test>for %F in (*.txt, *.png) do @certutil -hashfile "%F" SHA256
SHA256 ハッシュ (対象 hashtest.txt):
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
CertUtil: -hashfile コマンドは正常に完了しました。
SHA256 ハッシュ (対象 hogehoge.txt):
4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d
CertUtil: -hashfile コマンドは正常に完了しました。
SHA256 ハッシュ (対象 hashtest.png):
eb2cb719d02d94af5d2e4fff3618203061a421a2ba7463c65aff2272f08d53b7
CertUtil: -hashfile コマンドは正常に完了しました。

まとめ

Get-FileHashコマンドの方が使い勝手が良いので、PowerShellが利用できる場合はこちらをお勧めします。
利用出来ない環境ではcertutilを使用するといった感じでしょうか。

その他検証中に発生したこと

検証中、空ファイル(0byte)のハッシュ値を求めた時の挙動が違いました。
Get-FileHashは求める事が出来ますが、certutil.exeはエラーとなります。

PS C:\test> Get-FileHash .\zerobyte.txt
Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855       C:\test\zerobyte.txt
c:\test>certutil -hashfile zerobyte.txt SHA256
CertUtil: -hashfile コマンド エラーです: 0x800703ee (WIN32: 1006 ERROR_FILE_INVALID)
CertUtil: ファイルを格納しているボリュームが外部的に変更されたため、開かれているファイルが無効になりました。


当サイトはさくらインターネットのレンタルサーバーを利用しています。