【bat】ファイルのハッシュ値(MD5・SHA1)を取得する方法(certutil活用)

ダウンロードしたインストーラーや配布物の整合性確認には、MD5 や SHA1 といったハッシュ値の照合が有効です。
Windows には追加インストール不要で使える certutil が標準搭載されており、バッチから簡単に呼び出せます。
ここでは単体ファイルの計算、バッチでの取り回し、複数ファイル処理、期待値との照合までを実例でまとめます。

単体ファイルのハッシュ値を表示する

もっとも基本の使い方は certutil -hashfile <ファイル> <アルゴリズム> です。アルゴリズムは MD5 / SHA1 / SHA256 などが指定できます。

@echo off
certutil -hashfile "C:\download\setup.exe" MD5
certutil -hashfile "C:\download\setup.exe" SHA1
rem 参考:より強い SHA256
certutil -hashfile "C:\download\setup.exe" SHA256

ハッシュ値の文字列だけを変数に取り出す

certutil の出力は「ヘッダー行」「ハッシュ値本体」「空行」「CertUtil: の行」という構成です。findstr で16進数行のみ抽出し、for /f で受けると本体だけを取得できます。

@echo off
setlocal EnableDelayedExpansion

set "FILE=C:\download\setup.exe"

for /f "tokens=* delims=" %%H in ('
  certutil -hashfile "%FILE%" MD5 ^| findstr /R "^[0-9A-F][0-9A-F]"
') do set "MD5=%%H"

for /f "tokens=* delims=" %%H in ('
  certutil -hashfile "%FILE%" SHA1 ^| findstr /R "^[0-9A-F][0-9A-F]"
') do set "SHA1=%%H"

echo MD5 : %MD5%
echo SHA1: %SHA1%
endlocal

期待ハッシュと照合して検証する(OK/NGを判定)

サイトやベンダーが公開するハッシュ値と一致するかを比較して検証できます。大文字小文字は気にせず比較したいので、/I オプションで大小無視の比較にします。

@echo off
setlocal
set "FILE=C:\download\setup.exe"
set "EXPECT_SHA1=4F7A2D7B5E1C7B63B0A9B0D0D6FA1A6F2B3F1A9C"

for /f "tokens=* delims=" %%H in ('
  certutil -hashfile "%FILE%" SHA1 ^| findstr /R "^[0-9A-F][0-9A-F]"
') do set "ACTUAL=%%H"

if /I "%ACTUAL%"=="%EXPECT_SHA1%" (
  echo OK: ハッシュ一致
  exit /b 0
) else (
  echo NG: ハッシュ不一致
  echo 期待: %EXPECT_SHA1%
  echo 実際: %ACTUAL%
  exit /b 1
)
endlocal

フォルダ内の複数ファイルを一括でハッシュ化して一覧出力

配布ディレクトリの全ファイルについて MD5(または SHA1)を計算し、CSV に落とし込みます。スペースや日本語を含むパスは必ず二重引用符で囲みます。

@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"

set "ALG=SHA1"
set "OUT=hashlist.csv"
>"%OUT%" echo "File","%ALG%"

for /f "delims=" %%F in ('dir /b /a:-d') do (
  set "HASH="
  for /f "tokens=* delims=" %%H in ('
    certutil -hashfile "%%~fF" %ALG% ^| findstr /R "^[0-9A-F][0-9A-F]"
  ') do set "HASH=%%H"
  echo "%%~fF","!HASH!" >>"%OUT%"
)

echo 出力: %OUT%
endlocal

大きいファイルや大量処理での実務上の注意点

ハッシュ計算はファイル全体を読み込むため時間がかかります。ネットワーク越しの場合は一度ローカルにコピーしてから計算すると速度と安定性が向上します。タスクスケジューラで無人実行する場合はログにリダイレクトし、退出コードで成否判定できるようにします。

@echo off
set "FILE=\\server\share\big.iso"
set "LOCAL=%TEMP%\big.iso"
copy /y "%FILE%" "%LOCAL%" >nul || (echo コピー失敗 & exit /b 2)
certutil -hashfile "%LOCAL%" SHA256 > hash.log 2>&1
if errorlevel 1 (echo 計算失敗 & exit /b 3)
type hash.log

SHA1やMD5を使うときのセキュリティ補足

MD5・SHA1 は衝突耐性が弱く、改ざん検出用途では強度が不足します。互換性目的で提示される場面はありますが、検証では SHA256 以降を推奨します。どうしても MD5/SHA1 での照合が必要なときは、配布元の正当性(HTTPS・署名)も併せて確認してください。

まとめ

追加ツールなしでハッシュ値を扱うなら certutil -hashfile が最短です。単体表示、findstrfor /f での取り出し、期待値照合、複数ファイルの一括計算までをテンプレート化しておけば、配布検証や受け入れチェックをバッチだけで自動化できます。新規案件では可能な限り SHA256 を採用し、ログと終了コードで機械判定しやすい形に整えておくと運用が安定します。