🤝

ツール不要!Windows標準機能でハッシュ値を確認する2通りの方法

2023/08/28に公開

概要

Web上のデータをダウンロードした場合、そのファイルを実行する前にハッシュ値を確認する事で、
クラッカー(悪意のある人)がファイルを改ざんしていないかチェック可能です。

今までハッシュ値を確認する場合、ツールを導入する必要があると思っていましたが、
PowerShellによりハッシュ値を確認する方法があったので紹介します。

この記事のターゲット

  • Windowsユーザーの方
  • 標準ツールのみでハッシュ値をチェックしたい方
    • 1つ目:Windows標準コマンドであるcertutilコマンドでハッシュ値を取得
      (certutilコマンドは、コマンドプロンプトでも実行可能)
    • 2つ目:PowerShellコマンドレットであるGet-FileHashでハッシュ値を取得
    • 取得したハッシュ値をPowerShell CLIで比較(照合)する方法

PowerShell環境

$PSVersionTableの確認結果
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ファイル)]をチェック対象としています。

  1. GitHubのリリース情報よりダウンロードするファイルのハッシュ値を確認。
    GitHubのページにて「PowerShell-7.3.6-win-x64.zip」のハッシュ値を確認。

    GitHubページの抜粋(ハッシュ値の記載場所)
    ・PowerShell-7.3.6-win-x64.zip
     ・FCBD1699BEAED9E42D8D335C60F17C746055C4F05D4D658D2F54B88F99BD01BA
    
  2. 対象のファイルをダウンロード
    v7.3.6 Release of PowerShellページ内 - Assets - PowerShell-7.3.6-win-x64.zipのリンクをクリック

  3. PowerShellを管理者として実行する場合

    • マウス操作の経由
      1. ⊞スタートメニュー - Windows PowerShellフォルダー - Windows PowerShell を右クリック
      2. その他 - 管理者として実行 を選択
      3. (表示された場合)ユーザーアカウント制御の「はい」をクリック
    • 名前を指定して実行の経由
      1. ⊞Winキー + R で 名前を指定して実行 を起動
      2. 名前(O)欄で「powershell」と入力
      3. 「Ctrl + Shift + Enter」もしくはCtrl + Shift + OKボタンをクリック
      4. (表示された場合)ユーザーアカウント制御の「はい」をクリック
  4. ダウンロードしたファイルのハッシュ値を取得

    下記のコマンドでは、人の目でチェックしやすいようハッシュ値を「 .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>
    
  5. ハッシュ値の比較(サイト上に記載されたハッシュ値 と 実データのハッシュ値の照合)
    演算子「 -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コマンドレットでハッシュ値を取得する方法

  1. GitHubのリリース情報よりダウンロードするファイルのハッシュ値を確認。
    上記の手順(certutilコマンドを使った方法)と同様。

  2. 対象のファイルをダウンロード
    上記の手順(certutilコマンドを使った方法)と同様。

  3. PowerShellを管理者として実行する場合
    上記の手順(certutilコマンドを使った方法)と同様。

  4. ダウンロードしたファイルのハッシュ値を取得

    コピー用
    $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>
    
  5. ハッシュ値の比較(サイト上に記載されたハッシュ値 と 実データのハッシュ値の照合)
    上記の手順(certutilコマンドを使った方法)と同様。

参考情報

まとめ

  • ハッシュ値の確認は、Window標準「certutilコマンド」で実現
  • PowerShellコマンドレット「Get-FileHash」でもハッシュ値の取得可能(2023.11.15 追記)
  • ハッシュ値の比較(照合)は「-eq-ieqでも同じ)」で実現

今までハッシュ値の比較する場合、ツールの導入が必須と思っていましたが、認識を誤っていました。
今回、紹介する方法であれば、Windows標準機能だけでハッシュ値を照合できるので比較的、簡単に対応できそうです。

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion