ツール不要!Windows標準機能でハッシュ値を確認する2通りの方法
概要
Web上のデータをダウンロードした場合、そのファイルを実行する前にハッシュ値を確認する事で、
クラッカー(悪意のある人)がファイルを改ざんしていないかチェック可能です。
今までハッシュ値を確認する場合、ツールを導入する必要があると思っていましたが、
PowerShellによりハッシュ値を確認する方法があったので紹介します。
この記事のターゲット
- Windowsユーザーの方
- 標準ツールのみでハッシュ値をチェックしたい方
- 1つ目:Windows標準コマンドであるcertutilコマンドでハッシュ値を取得
(certutilコマンドは、コマンドプロンプトでも実行可能) - 2つ目:PowerShellコマンドレットであるGet-FileHashでハッシュ値を取得
- 取得したハッシュ値をPowerShell CLIで比較(照合)する方法
- 1つ目:Windows標準コマンドであるcertutilコマンドでハッシュ値を取得
PowerShell環境
PS C:\WINDOWS\system32> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.19041.3031
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.3031
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PS C:\WINDOWS\system32>
ハッシュ値の確認手順
1つ目:certutilコマンドでハッシュ値を取得する方法
今回紹介する手順では、GitHubにコミットされているPowerShell Core[Windows版プリインストールデータ(zipファイル)]をチェック対象としています。
-
GitHubのリリース情報よりダウンロードするファイルのハッシュ値を確認。
GitHubのページにて「PowerShell-7.3.6-win-x64.zip」のハッシュ値を確認。GitHubページの抜粋(ハッシュ値の記載場所)・PowerShell-7.3.6-win-x64.zip ・FCBD1699BEAED9E42D8D335C60F17C746055C4F05D4D658D2F54B88F99BD01BA
-
対象のファイルをダウンロード
v7.3.6 Release of PowerShellページ内 - Assets - PowerShell-7.3.6-win-x64.zipのリンクをクリック -
PowerShellを管理者として実行する場合
- マウス操作の経由
- ⊞スタートメニュー - Windows PowerShellフォルダー - Windows PowerShell を右クリック
- その他 - 管理者として実行 を選択
- (表示された場合)ユーザーアカウント制御の「はい」をクリック
- 名前を指定して実行の経由
- ⊞Winキー + R で 名前を指定して実行 を起動
- 名前(O)欄で「
powershell
」と入力 - 「Ctrl + Shift + Enter」もしくはCtrl + Shift + OKボタンをクリック
- (表示された場合)ユーザーアカウント制御の「はい」をクリック
- マウス操作の経由
-
ダウンロードしたファイルのハッシュ値を取得
下記のコマンドでは、人の目でチェックしやすいようハッシュ値を「
.ToUpper()
」で大文字にしているが、
ハッシュ値は16進数で構成されており、同一性を比較する上では大文字・小文字を区別する必要がない。コピー用$hash_result = (certutil -hashfile "対象ファイルのフルパス(絶対パス)" SHA256) $hash_result[1].ToUpper()
certutilコマンドを使った方法の結果PS C:\WINDOWS\system32> $hash_result = (certutil -hashfile "D:\Downloads\PowerShell-7.3.6-win-x64\PowerShell-7.3.6-win-x64.zip" SHA256) PS C:\WINDOWS\system32> PS C:\WINDOWS\system32> $hash_result[1].ToUpper() FCBD1699BEAED9E42D8D335C60F17C746055C4F05D4D658D2F54B88F99BD01BA PS C:\WINDOWS\system32>
普通にcertutilコマンドを実行した結果 < クリックで折りたたみが開く >
普通に実行した場合PS C:\WINDOWS\system32> certutil -hashfile "D:\Downloads\PowerShell-7.3.6-win-x64\PowerShell-7.3.6-win-x64.zip" SHA256 SHA256 ハッシュ (対象 D:\Downloads\PowerShell-7.3.6-win-x64\PowerShell-7.3.6-win-x64.zip): fcbd1699beaed9e42d8d335c60f17c746055c4f05d4d658d2f54b88f99bd01ba CertUtil: -hashfile コマンドは正常に完了しました。 PS C:\WINDOWS\system32>
- 参考情報:certutilコマンドを使った方法
https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/certutil
- 参考情報:certutilコマンドを使った方法
-
ハッシュ値の比較(サイト上に記載されたハッシュ値 と 実データのハッシュ値の照合)
演算子「-eq
」( 明示的に大文字・小文字を区別しない-ieq
でも同じ結果 )を使用してハッシュ値を比較。
※ 同じような比較演算子「-match
」では部分一致の際に使用する演算子であり、
今回のようなハッシュ値は完全一致で比較する必要がある為、使用できない。ハッシュ値を比較するコマンド(コピー用)"サイト上に記載されたハッシュ値" -eq ` "ダウンロードしたファイルのハッシュ値"
[実例]PowerShell CLIで確認した結果(OKパターン)PS C:\WINDOWS\system32> "FCBD1699BEAED9E42D8D335C60F17C746055C4F05D4D658D2F54B88F99BD01BA" -eq ` >> "FCBD1699BEAED9E42D8D335C60F17C746055C4F05D4D658D2F54B88F99BD01BA" True PS C:\WINDOWS\system32>
ハッシュ値が一致する場合、上記のように「
True
」が返る。[実例]PowerShell CLIで確認した結果(NGパターン)PS C:\WINDOWS\system32> "FCBD1699BEAED9E42D8D335C60F17C746055C4F05D4D658D2F54B88F99BD01BA" -eq ` >> "ZCBD1699BEAED9E42D8D335C60F17C746055C4F05D4D658D2F54B88F99BD01BA" False PS C:\WINDOWS\system32>
ハッシュ値が一致しない場合、上記のように「
False
」が返る。
2つ目:Get-FileHashコマンドレットでハッシュ値を取得する方法
-
GitHubのリリース情報よりダウンロードするファイルのハッシュ値を確認。
上記の手順(certutilコマンドを使った方法)と同様。 -
対象のファイルをダウンロード
上記の手順(certutilコマンドを使った方法)と同様。 -
PowerShellを管理者として実行する場合
上記の手順(certutilコマンドを使った方法)と同様。 -
ダウンロードしたファイルのハッシュ値を取得
コピー用$hash_result = (Get-FileHash -Path "D:\Downloads\PowerShell-7.3.6-win-x64\PowerShell-7.3.6-win-x64.zip" -Algorithm SHA256) $hash_result.Hash
Get-FileHashコマンドレットを使った方法結果PS C:\WINDOWS\system32> $hash_result = (Get-FileHash -Path "D:\Downloads\PowerShell-7.3.6-win-x64\PowerShell-7.3.6-win-x64.zip" -Algorithm SHA256) PS C:\WINDOWS\system32> PS C:\WINDOWS\system32> $hash_result.Hash FCBD1699BEAED9E42D8D335C60F17C746055C4F05D4D658D2F54B88F99BD01BA PS C:\WINDOWS\system32>
普通にGet-FileHashコマンドレットを実行した結果 < クリックで折りたたみが開く >
普通に実行した場合PS C:\WINDOWS\system32> Get-FileHash -Path "D:\Downloads\PowerShell-7.3.6-win-x64\PowerShell-7.3.6-win-x64.zip" -Algorithm SHA256 Algorithm Hash Path --------- ---- ---- SHA256 FCBD1699BEAED9E42D8D335C60F17C746055C4F05D4D658D2F54B88F99BD01BA D:\Downloads\PowerShell-7.3.6... PS C:\WINDOWS\system32>
- 参考情報:Get-FileHashコマンドレットを使った方法
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/get-filehash
- 参考情報:Get-FileHashコマンドレットを使った方法
-
ハッシュ値の比較(サイト上に記載されたハッシュ値 と 実データのハッシュ値の照合)
上記の手順(certutilコマンドを使った方法)と同様。
参考情報
- 公式ドキュメント certutil
https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/certutil - ソフトのダウンロードリンク と ハッシュ値が一緒に記載されている意味
https://penpen-dev.com/blog/hash-koukai-imi/ - 公式ドキュメント Get-FileHash
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/get-filehash
まとめ
- ハッシュ値の確認は、Window標準「certutilコマンド」で実現
- PowerShellコマンドレット「Get-FileHash」でもハッシュ値の取得可能(2023.11.15 追記)
- ハッシュ値の比較(照合)は「
-eq
(-ieq
でも同じ)」で実現
今までハッシュ値の比較する場合、ツールの導入が必須と思っていましたが、認識を誤っていました。
今回、紹介する方法であれば、Windows標準機能だけでハッシュ値を照合できるので比較的、簡単に対応できそうです。
関連記事
Discussion