ソフトウェアをダウンロードした時のハッシュ値確認や検体をVirusTotal等で検索する際にファイルのハッシュ値を求めるケースがあります。
会社で利用するパソコンの場合、勝手にソフトウェアを入れることが出来ないケースが多いので、Windows標準で求める方法を記載します。
なお、検証の環境はWindows 10 21H1にて実施しています。
Windowsバージョンによっては使用出来なかったり、PowerShell自体がグループポリシーで禁止されている事はあります。
目次
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
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: ファイルを格納しているボリュームが外部的に変更されたため、開かれているファイルが無効になりました。