Webサイトなどで配布されているファイルは、ダウンロード時に破損したり、悪意のある攻撃者によって改ざんされていたりする可能性がある。ダウンロードしたファイルの「ハッシュ値」を計算して、正しいファイルであるかどうかをチェックする方法を解説する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
対象OS:Windows 8.1/Windows 10/Windows 11、Windows Server 2012/Windows Server 2012 R2/Windows Server 2016/Windows Server 2019/Windows Server 2022
Webサイトなどで公開、配布されているプログラムやISOファイル、バイナリファイルなどをダウンロードした場合、それが正規に配布されているものであり、改ざんされていたり、ダウンロードが途中で失敗していたりしていないかどうか(一部が破損や欠落していないかどうか)を確認するのは重要なことである。もし内容が違っていると、プログラムのインストールや実行ができなかったり、ウイルスなどに感染してしまったりする可能性があるからだ。
本Tech TIPSでは、Windows OS環境を対象として、「ハッシュ値」というものを利用してファイルの破壊や改ざんがないか確認する具体的な方法を説明する。また複数ファイルを一括で照合するためのスクリプト例も紹介しよう。
手元にダウンロードしたファイルが、Webサイト上で配布されているファイルと同じかどうか、つまりバイナリデータとして完全に一致するかどうかを調べたい場合、一般的には「チェックサム(個々の語の総計を符号値とするもの)」や「ハッシュ値」「CRC」「メッセージダイジェスト(任意長のデータを小さい固定的なサイズのデータに要約/縮約する関数)」などの値を計算して比較する。これらの値は、ファイルの内容をあるアルゴリズムに基づいて計算し、64bitや256bit、512bitといった固定長のデータに変換したものである。結果は、通常は16進数で表記する。
ハッシュ値を使うと、ファイルの内容や長さ、ファイル名、更新日付などにかかわらず、常に、短い固定長のデータとして簡単に比較できるようになる。内容がたった1bit違っているだけでも結果のハッシュ値は大きく異なる(ことが多い)ため、人間が見ても異なるファイルであることを簡単に判別できる。
大きなデータやプログラムなどを配布しているサイトでは、ファイルのチェックサムやハッシュ値などの情報も同時に掲載していることが少なくない。ユーザーは、ダウンロードしたファイルのハッシュ値を計算して、Webサイト上の記述と比較することにより、ダウンロードの成功/失敗、改ざんの有無を容易に判断できる。
ファイル(データ)の同一性をチェックするための計算アルゴリズムには、さまざまなものがある。以下に、よく知られているものを挙げておく。
アルゴリズム | 主なbit数 | 概要 |
---|---|---|
MD5 | 128bit | Message Digest Algorithm 5。公開暗号システムを開発したRonald Rivestが開発したハッシュアルゴリズム。現在では非推奨。ただしファイルの同一性チェックでは使われることがまだある |
SHA-1 | 160bit | Secure Hash Algorithm 1。アメリカの標準暗号化規格として当初採用されたハッシュアルゴリズム。現在では非推奨。ただしファイルの同一性チェックではまだ使われている |
SHA-2: SHA-256/SHA-512 |
256/512bit/他 | SHA-2はSHA-1の改良系。SHA-2にはbit数の異なる複数の規格があり、256bitと512bitのものは特にSHA-256/SHA-512と呼ばれる |
SHA-3: BLAKE |
任意 | SHA-3はSHA-2の後継規格。実際にはBLAKEというアルゴリズムが採用されている |
CRC32/CRC64 | 32/64bit | 古くから(主にシリアルデータ伝送回線において)使われているチェックコード生成アルゴリズム。ダウンロードサイトで見かけることは少ない |
RIPEMD | 128/160/256/320bit | MD5の前身であるMD4をベースにした改良アルゴリズム。160bitのRIPEMD-160がよく使われている |
ファイルのハッシュ値やチェックサム計算に使われる主なハッシュアルゴリズム |
ファイルのハッシュ値を求めるには、そのためのソフトウェアツール(アプリやコマンド)が必要だ。本Tech TIPSでは、Windows OS環境で使える幾つかのハッシュ計算ツールのうち、下表のものを紹介しよう。
実行環境 | インストール済み? | MD5 | SHA-1 | SHA-256 | SHA-384 | SHA-512 | |
---|---|---|---|---|---|---|---|
7-Zip | WindowsのGUI | × | × | ○ | ○ | × | × |
7z.exe | コマンドプロンプトなど | × | × | ○ | ○ | × | × |
certutil.exe | コマンドプロンプトなど | ○ | ○ | ○ | ○ | ○ | ○ |
Get-FileHash | PowerShell | ○ | ○ | ○ | ○ | ○ | ○ |
md5sum | WSL(Linux) | ○ | ○ | × | × | × | × |
sha1sum | WSL(Linux) | ○ | × | ○ | × | × | × |
sha256sum | WSL(Linux) | ○ | × | × | ○ | × | × |
sha384sum | WSL(Linux) | ○ | × | × | × | ○ | × |
sha512sum | WSL(Linux) | ○ | × | × | × | × | ○ |
本Tech TIPSで紹介するハッシュ計算ツール |
「7-Zip」はもともと、GUIでファイルやフォルダをZIPファイルに圧縮したり、逆に展開したりするためのツールだ。これにはハッシュ値を計算する機能も用意されている。
このツールを使うには、別途インストールする必要がある。その方法については、Tech TIPS「ZIPファイルにパスワードを付ける」を参照していただきたい。
7-Zipをインストールすると、エクスプローラの右クリックメニューに新しく[7-Zip]−[CRC SHA]−[<ハッシュアルゴリズム>]という項目が追加される([CRC SHA]−[<ハッシュアルゴリズム>]の場合もある)。ハッシュ値を計算したいファイルを選んで右クリックし、ポップアップメニューからハッシュアルゴリズムを選択すると、そのファイルのハッシュ値が計算され、表示される。ただしWindows 11の場合は、右クリックしたらまず[他のオプションを表示]をクリックすること(これで[7-Zip]メニューが現れる)。
上述の7-Zipをインストールすると、「7z.exe」というコマンドラインコマンドも一緒にインストールされる。これを利用すると、コマンドプロンプトなどのCUIでファイルのハッシュ値を計算できる。
7z.exeを利用するには、7-ZipのインストールフォルダをPATH環境変数に追加しておく必要がある。その方法の詳細については、Tech TIPS「Path環境変数を設定/編集して、独自のコマンドを実行可能にする」を参考にしてほしい。
7z.exeを使ってハッシュ値を計算するには、7zにコマンド名「h」と、対象となるファイル名を指定する(ファイル名を省略するとカレントフォルダにある全ファイルが対象)。デフォルトではCRC32を求めるようになっているので、それ以外のハッシュ値を求めたい場合は「-scrc」オプションでアルゴリズムも指定する。
7z h -scrc<アルゴリズム名> <ファイル名>
<アルゴリズム名>には「CRC32」「CRC64」「SHA1」「SHA256」「BLAKE2sp」「*」のいずれかを指定できる(英小文字でもよい)。「*」は全てのハッシュ値を表示させるためのオプションだ。
7z h -scrc* sample.dat ……全てのハッシュ値を表示
7z h -scrcsha256 sample.dat ……SHA-256の値を表示
7z.exeコマンドのヘルプを表示させるには、「-h」オプションを指定する。
7-Zipのようなツールをインストールできない(したくない)場合は、「certutil.exe」コマンドが利用できる。これはWindows Vista/Windows Server 2008以降のWindows OSに標準で付属している。
certutil.exeコマンドでハッシュ値を計算するには、「-hashfile」オプションと、対象となるファイル名を指定する。デフォルトではSHA-1を求めるようになっているので、それ以外のハッシュ値を求めたい場合は、ファイル名の後にアルゴリズム名も指定する。
certutil -hashfile <ファイル名> <アルゴリズム名>
<アルゴリズム名>には「MD2」「MD4」「MD5」「SHA1」「SHA256」「SHA384」「SHA512」のいずれかを指定できる。英小文字で指定してもよい。ただし、Windows 7など以前のWindows OSでは英大文字で指定しないとエラーになることがあるので注意が必要だ。
certutil -hashfile sample.dat ……SHA-1の値を表示
certutil -hashfile sample.dat sha256 ……SHA-256の値を表示
certutil.exeは対象ファイルをワイルドカードで指定できない。そのため、複数ファイルのハッシュ値を一括で計算するには、以下のようにforコマンドを併用するといった工夫が必要だ。
certutil.exe -hashfileコマンドのヘルプを表示させるには、「-hashfile」と一緒に「-?」オプションも指定する。
PowerShellが利用できるなら、ファイルのハッシュ値の計算には「Get-FileHash」コマンドレットが便利だろう。
デフォルトではSHA-256の値を計算するので、それ以外のハッシュ値を求めたい場合は、「-Algorithm」パラメータでアルゴリズムも指定する。
Get-FileHash <ファイル名> -Algorithm <アルゴリズム名>
<アルゴリズム名>には「MD5」「SHA1」「SHA256」「SHA384」「SHA512」「MACTripleDES」「RIPEMD160」のいずれかを指定できる(英小文字でもよい)。ただし筆者が確認した限りでは、PowerShell 7.2だと「MACTripleDES」「RIPEMD160」は指定できなかった(エラーになった)。
Get-FileHash sample.dat ……SHA-256の値を表示
Get-FileHash sample.dat -algorithm sha1 ……SHA-1の値を表示
Get-FileHashのヘルプを表示させるには、「Get-Help Get-FileHash -Full」を実行する。
このGet-FileHashを応用すれば、複数ファイルのハッシュ値を一括で照合できる。まず、対象ファイルの正しいハッシュ値とそのパスの組み合わせを列挙したテキストファイルを用意する(区切りは半角スペースとし、ファイル名は「check_list.txt」とする)。
<ファイル1のハッシュ値> <ファイル1のパス>
<ファイル2のハッシュ値> <ファイル2のパス>
……
次に、以下のリストをコピーしてPowerShellのコンソールにペーストする。先頭4行の各変数については、必要に応じて変更していただきたい。
$list = ".\check_list.txt" # リストのパス
$delim = " " # 各列を区切る文字
$header = "HashFromWeb", "Path" # 各列の見出し
$algorithm = "SHA256" # ハッシュアルゴリズム名
Import-Csv $list -Delimiter $delim -Header $header | `
%{
$hashFromFile = (Get-FileHash $_.Path -Algorithm $algorithm).Hash
$verification = ($_.HashFromWeb -eq $hashFromFile)
-join($_.Path, ": ", $verification)
}
後は[Enter]キーを押して最後まで実行すると、以下のように照合結果が表示される。
7z2107-x64.exe: False
PowerShell-7.2.3-win-x64.msi: True
テキストファイルに記載のハッシュ値と、ファイルから計算された実際のハッシュ値が一致する(つまりファイル内容が壊れていない)場合は、「<対象ファイル名>: True」と表示される。逆に一致しない(ファイルが壊れていたり改ざんされていたりする)場合は、「<対象ファイル名>: False」と表示される。
WSL(Windows Subsystem for Linux)を使っているなら、以下のLinuxの各コマンドでハッシュ値を計算できる。ほとんどのディストリビューションでは、これらのコマンドはデフォルトでインストールされる。
コマンド名 | 機能 |
---|---|
md5sum | MD5の値を計算する |
sha1sum | SHA-1の値を計算する |
sha224sum | SHA-224の値を計算する |
sha256sum | SHA-256の値を計算する |
sha384sum | SHA-384の値を計算する |
sha512sum | SHA-512の値を計算する |
WSLで使えるハッシュ値を計算するためのコマンド |
これらのコマンドでは、対象となるファイル名を指定するだけで、それぞれのアルゴリズムでのハッシュ値が表示される。
md5sum sample.dat ……MD5の値を表示
sha1sum sample.dat ……SHA-1の値を表示
sha256sum sample.dat ……SHA-256の値を表示
対象ファイルはワイルドカードで指定できる。
各コマンドのヘルプを表示させるには、「--help」オプションを指定する。
さて、上記のコマンドでは、「-c」オプションを使って複数ファイルのハッシュ値の照合もできる。それにはまず、対象ファイルの正しいハッシュ値とそのパスの組み合わせを列挙したテキストファイルを用意する。区切りは半角スペースでよい。
<ファイル1のハッシュ値> <ファイル1のパス>
<ファイル2のハッシュ値> <ファイル2のパス>
……
次に、以下のコマンドラインを実行する(以下はSHA-256の例)。
sha256sum -c <上記のテキストファイル名>
テキストファイルに記載のハッシュ値と、ファイルから計算された実際のハッシュ値が一致する(つまりファイル内容が壊れていない)場合は、「<対象ファイル名>: OK」と表示される。逆に一致しない(ファイルが壊れていたり改ざんされていたりする)場合は、「<対象ファイル名>: FAILED」と表示される。
■更新履歴
【2022/05/19】PowerShellで複数ファイルのハッシュ値を一括で照合するためのスクリプトを追記しました。
【2022/05/18】Windows 11などに対応しました。WSLについて追記しました。当初紹介していたfcivコマンドがダウンロードできなくなったため、その記述を削除しました。
【2017/07/18】certutilコマンドを使う方法を追加しました。
【2017/07/13】最新のOSに合わせて内容を更新しました。当初紹介していたHastTabツールの代わりに、7-Zipツールの使い方を記載しました。
【2005/07/30】初版公開。対象はWindows 2000/Windows XP。
Copyright© Digital Advantage Corp. All Rights Reserved.