CERTUTIL(ハッシュ値・Base64)
ソフトウェアのダウンロードページに「SHA-256: 3a7bd3e2…」のような文字列が載っていることがあります。これはハッシュ値と呼ばれ、ダウンロードしたファイルが破損や改ざんをされていないか確認するための値です。
Windows には、追加ソフトなしでハッシュ値を計算できる CERTUTIL コマンドが標準で用意されています。
ハッシュ値とは
ハッシュ値とは、ファイルの内容から計算される固定長の文字列です。ファイルが 1 バイトでも異なれば、まったく別の値になります。公開されているハッシュ値と手元のファイルのハッシュ値が一致すれば、同じファイルであると確認できます。
基本的な使い方
CERTUTIL -hashfile ファイル名 [アルゴリズム]
certutil -hashfile setup.exe SHA256
2 行目がハッシュ値です。メッセージの言語は OS の表示言語によって異なり、日本語環境では文言が変わりますが、2 行目がハッシュ値である点は同じです。
アルゴリズムを省略した場合は SHA1 で計算されます。配布元が SHA-256 を公開しているときは、必ず
SHA256 を明示してください。
指定できるアルゴリズム
| アルゴリズム | 説明 |
|---|---|
MD2、MD4 | 128 ビット。非常に古く、使うべきではない |
MD5 | 128 ビット。古い形式で、改ざん対策には不向き |
SHA1 | 160 ビット。既定値。こちらも安全性は低い |
SHA256 | 256 ビット。現在もっとも広く使われている |
SHA384 | 384 ビット |
SHA512 | 512 ビット |
MD5 や SHA1 は、同じハッシュ値を持つ別のファイルを意図的に作れることが知られています。そのため、意図しない破損の検出には使えても、悪意ある改ざんの確認には向きません。配布元が提供していれば SHA256 以上を使いましょう。
公開されたハッシュ値と比較する
ハッシュ値は長いため、目視で比べると見落としがちです。findstr に公開されている値を渡すと、一致するかを確実に判定できます。
certutil -hashfile setup.exe SHA256 | findstr /I "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b"
一致すれば該当行が表示され、一致しなければ何も表示されません。/I オプションで大文字・小文字の違いを無視しています。
CertUtil: -hashfile command completed successfully.
の行は、ハッシュ値と無関係にどのファイルでも表示されます。ハッシュ値そのものを指定して検索することで、この行を拾う誤判定を避けられます。
バッチファイルで自動比較する
引数で受け取ったファイルと期待するハッシュ値を比較する例です。
@echo off
setlocal EnableDelayedExpansion
set "FILE=%~1"
set "EXPECTED=%~2"
set "ACTUAL="
for /f "skip=1 delims=" %%H in ('certutil -hashfile "%FILE%" SHA256') do (
if not defined ACTUAL set "ACTUAL=%%H"
)
set "ACTUAL=!ACTUAL: =!"
if /I "!ACTUAL!"=="%EXPECTED%" (
echo [OK] ハッシュ値が一致しました。
) else (
echo [NG] ハッシュ値が一致しません。
exit /b 1
)
endlocal
verify_hash.cmd setup.exe 3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b
skip=1 で 1 行目の説明行を飛ばし、2 行目以降で最初に取得できた行(ハッシュ値)だけを変数に保存しています。古い Windows ではハッシュ値が 2 文字ごとにスペースで区切られて表示されるため、!ACTUAL: =! でスペースを取り除いています。
Base64 でエンコード・デコードする
CERTUTIL は、ファイルを Base64 形式の文字列に変換することもできます。
certutil -encode input.bin output.txt
certutil -decode output.txt restored.bin
-encode で作成されたファイルには、先頭に -----BEGIN CERTIFICATE-----、末尾に -----END CERTIFICATE----- の行が付きます。データが証明書でなくても付きます。-decode
はこの行が付いたままでも正しく復元できます。Base64
だけが必要な場合は、これらの行を取り除いてください。
出力先に同名のファイルがあると、エラーになり処理されません。上書きするには certutil -f -encode input.bin output.txt のように -f を付けます。-f
を付けると確認なしで上書きされるため、重要なファイルを指定しないよう注意してください。
よくあるエラー
ファイルが見つからないときは、次のようなエラーになります。

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
ファイル名にスペースが含まれる場合は "my file.exe" のようにダブルクォーテーションで囲んでください。
失敗したときは 0 以外の終了コードが返ります。ファイルが見つからない場合は -2147024894 のような負の値になるため、IF ERRORLEVEL 1 ではなく IF %ERRORLEVEL% NEQ 0 や || で判定してください。
まとめ
| 操作 | コマンド |
|---|---|
| SHA-256 を計算する | certutil -hashfile ファイル SHA256 |
| MD5 を計算する | certutil -hashfile ファイル MD5 |
| ファイルを Base64 にする | certutil -encode 入力 出力 |
| Base64 をファイルに戻す | certutil -decode 入力 出力 |