ダウンロードしたインストーラーや配布物の整合性確認には、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
が最短です。単体表示、findstr
+for /f
での取り出し、期待値照合、複数ファイルの一括計算までをテンプレート化しておけば、配布検証や受け入れチェックをバッチだけで自動化できます。新規案件では可能な限り SHA256 を採用し、ログと終了コードで機械判定しやすい形に整えておくと運用が安定します。