連載
» 2005年07月30日 00時00分 UPDATE

Tech TIPS:Windowsでハッシュ値を利用してファイルの同一性をチェックする

Webサイトなどで配布されているファイルは、ダウンロード時に破損したり、悪意のある攻撃者によって改ざんされていたりすることがある。ファイルの「ハッシュ値」を計算・比較できるようにしておくと、こうしたトラブルを防止しやすくなる。

[デジタルアドバンテージ,著]
Tech TIPS
Windows Server Insider


「Tech TIPS」のインデックス

連載目次

対象OS:Windows 9x/Windows Me/Windows 2000/Windows XP/Windows Server 2003



解説

 Webサイトなどで公開、配布されているバイナリ・ファイルが正規のものであり、改ざんされたり、ダウンロードが途中で失敗して(一部が欠落して)いないかどうかを確認するのは重要なことである。

 例えば2005年7月11日、Download.comサイトがミラー、配布していた「Daemon-Tools」のバイナリにトロイの木馬が仕込まれていた、という事件があった(DAEMON Tools公式サイト)。このとき、すでにダウンロードして利用していたファイルがオリジナルと同一のものかどうかをチェックする必要性を再認識した読者もいることだろう。

 何らかの理由でファイルが破損していないか、オリジナルから変更されていないかをチェックする場合には、ファイルの「ハッシュ値」(セキュリティ用語事典:ハッシュ関数)を比較する方法が広く使われている。

 フリーソフトウェアやシェアウェアでは、配布サイト上にMD5(セキュリティ用語事典:MD5)やSHA1方式によるハッシュ値を掲載し、ダウンロード中にファイルが破損するなどの理由でオリジナルと違ってしまっていないかを確認できるようにしているサイトも多い。

ハッシュ値を提供するダウンロード・サイトの例 ハッシュ値を提供するダウンロード・サイトの例
バイナリ・ファイルを配布するサイトでは、ファイルだけでなく、そのファイルのハッシュ値も同時に提供している場合が少なくない。これはシマンテック社のサイトの例。ファイル名のリンクの下に、「MD5: 〜」としてハッシュ値も掲載されている。MD5以外にも、SHA1というアルゴリズムもよく使われる。ダウンロードしたファイルのハッシュ値を計算して、この値と比較することにより、ファイルが正しくダウンロードできたことを確認できる。
  (1)ファイル名。
  (2)MD5アルゴリズムによって計算されたハッシュ値。32桁の16進数(128bit)。

 このような場合には、ファイルのハッシュ値を確認するツールを導入すればよい。単一ファイルのハッシュ値を比較するなら、GUIのツールが適している。例えば、ファイルのプロパティにハッシュ値を表示/比較できるタブを追加する「HashTab Shell Extension」(無償)を使うとよいだろう。

 また、例えばWebサイトの管理者が検証用サーバと公開サーバの変更個所を探すといった、大量のファイルを持つフォルダ同士を比較する場合にもハッシュ値を利用する方法が有効だ。

 大量のファイルの比較をdiff(Unix系OS)やfcコマンド(Windows系OS)で行うと、比較元と比較対象のファイルのすべてのデータを比較するため、非常に時間がかかる(別サーバのデータの場合、ネットワーク越しになるのでさらに低速になる)。そこで、あらかじめ元のファイルのハッシュ値をXMLファイルにスナップショットとして用意しておき、対象サーバと比較すると効率的である。

 このような場合は、コマンドライン・ツールの「File Checksum Integrity Verifier utility」(無償)を利用するとよいだろう。

操作方法

●単一のファイルのハッシュ値を比較する

 単一のファイルを比較するなら、GUIで操作できるHashTabを利用するのが便利だ。Beeblebrox.orgのダウンロード・サイトからHashtab Shell Extensionのインストーラを入手し、インストール作業を行う。インストールが完了すると、以下の画面のようにファイルのプロパティ表示に[ハッシュ値]タブが追加される。HashTabは、MD5/SHA1/CRC-32の3方式に対応している。

ハッシュ値をプロパティで表示する ハッシュ値をプロパティで表示する
HashTabをインストール後、エクスプローラでファイルを選択して右クリックして表示されるポップアップ・メニューから[プロパティ]を選択すると、新しく[ハッシュ値]タブが追加されている。このファイルに対するMD5/SHA1/CRC-32の3つの値が開いた段階で計算されている。この数値列を目で追いながら比較してもよいが、長くて間違いやすいので、それぞれの値はテキストとしてカット&ペーストして比較できるようになっている。比較した結果、ハッシュ値が異なると(別ファイルであると判断されると)、「異なります」というダイアログが表示される。
  (1)ファイルの[プロパティ]ダイアログで[ハッシュ値]タブを開く。
  (2)MD5方式のハッシュ値エリア。
  (3)ファイルのMD5ハッシュ値。
  (4)比較対象となる値(16進数文字列)を入力する。
  (5)SHA1方式のハッシュ値エリア。
  (6)CRC-32チェックサムのエリア。
  (7)これをクリックすると比較が実行される。
  (8)比較結果が異なる場合は、このように「異なります」というダイアログが表示される。

●複数ファイルやディレクトリ単位で同一性をチェックする

 HashTabはGUI操作が可能であり、メッセージも日本語化されていて大変扱いやすい。だがWebサーバのディレクトリごとの比較といった、複数ファイルやディレクトリ単位でのハッシュ値算出/比較には向いていない。

 大量のファイルをハッシュ値で比較したい場合には、コマンドラインから利用する「File Checksum Integrity Verifier utility」(以下FCIV)を使うとよい。ただし、日本語を含むディレクトリ名とファイル名ではエラーとなることがある点に注意が必要だ。

 FCIVを利用するには、まず自己展開型の実行ファイル(windows-kb841290-x86-enu.exe )をマイクロソフトのサイトから入手し、実行する。すると、ReadMe.txtとfciv.exeという2つのファイルが展開される。

 fciv.exeは、PATHの通っている場所(例えば%SystemRoot%\system32などのフォルダ)にコピーするか、適当なフォルダにコピーしてPATHに該当フォルダを追加しておけば、利用しやすいだろう。PATH環境変数の変更については、TIPS「環境変数を変更する」を参考にしてほしい。

 FCIVの構文は以下のようになっている。

fciv [ コマンドオプション



 コマンドは「-add」(ハッシュ値生成)、「-list」(XMLファイルからリスト表示)、「-v」(リストとの比較)の3つがあり、デフォルトは「-add」となっている。デフォルトのハッシュ算出方法は、MD5方式となる。オプションの内容はコマンドごとに異なる。

●ファイルのハッシュ値を求めるには

 単純にハッシュ値を求めるだけなら、

fciv ファイル名



とすればよい。実際に実行すると、以下のように出力される。

C:\>fciv sample.txt  ……sample.txtのMD5ハッシュ値を算出
//
// File Checksum Integrity Verifier version 2.05.
//
d41d8cd98f00b204e9800998ecf8427e sample.txt  ……ハッシュ値とファイル名



 特定のフォルダ以下に含まれるすべてのファイルとサブフォルダ以下のファイルのハッシュ値を求めるには、「-r」オプションを付ける。

 また.exeファイルだけを対象にするなら「-type *.exe」を指定する。

 画面にハッシュ値が表示されるので、リダイレクトしてテキスト・ファイルの形で再利用してもよいだろう。例えば、%SystemRoot%\system32以下の*.exeファイルのハッシュを求めると、以下のように出力される。

C:\WINDOWS>fciv -add system32  -r -type *.exe  ……system32フォルダ以下に含まれる*.exeファイルのハッシュ値を求める
//
// File Checksum Integrity Verifier version 2.05.
//
Start Time: 07/28/2005 at 17h42'57''

5a106ae84a11d038d1d83b5b7abf186f system32\accwiz.exe
74d8c6b1714e5c63560056f2efa39b76 system32\actmovie.exe
……(中略)……
1565a23cfd855c7abb4cf1d64eaadcd8 system32\yzdec.exe

End Time..: 07/28/2005 at 17h43'07''


Processed 266 directories
Processed 6295 files
Errors have been reported to fciv.err



●ファイルやフォルダの比較にハッシュ値を利用するには

 FCIVの重要な機能に、算出したハッシュ値のXMLファイルへの書き出し(データベース化)と、そのXMLファイルの情報と、既存ファイルとの比較がある。2つのフォルダのどのファイルが更新されたかをチェックする場合など、あらかじめ基準となるハッシュ値のXMLファイルを作っておけば、すべてのバイナリ比較を行うよりも高速に比較できる。

 そのためには、まず比較元となるハッシュ値をXMLファイルに書き出す必要がある。

fciv -add フォルダ名(あるいはファイル名) -xml XMLファイル名



 指定したXMLファイルが存在しない場合は、「Error loading XML document.」と「Create New XML database.」の2行のメッセージが表示され、XMLファイルが作成される。

 もし指定したXMLファイルが存在していた場合には、「Error loading XML document.」が表示されず、XMLファイルの末尾にエントリが追加される。出来上がったXMLファイルには、ファイルのフルパス名とハッシュ値が格納されている。ただしBASE64エンコードされているので、XMLファイルをIEなどで開いても、ハッシュ値は意味不明な文字列として表示される。

 XMLファイルに書き込まれたハッシュ値とファイルを比較する場合には、以下のように入力する。

fciv -v ディレクトリ名(あるいはファイル名) -xml XMLファイル名



 正しく実行され、ハッシュ値が同一であった場合、以下のように表示される。

c:\>fciv -v sample.exe -xml sample.xml  ……sample.exeのハッシュ値をsample.xmlに保存
//
// File Checksum Integrity Verifier version 2.05.
//
Starting checksums verification : 07/27/2005 at 19h53'46

All files verified successfully

End Verification : 07/27/2005 at 19h53'46



 もしファイルのハッシュ値が異なっていた場合には、以下のように表示される。

C:\>fciv -v sample.exe -xml sample.xml  ……sample.xmlに保存されたハッシュ値とsample.exeファイルのハッシュ値を比較
//
// File Checksum Integrity Verifier version 2.05.
//
Starting checksums verification : 07/27/2005 at 15h55'26

List of modified files:
-----------------------
sample.exe  ……対象ファイル名
        Hash is         : d257a6198080bbfaa220bd37f250fa8a  ……対象ファイルのハッシュ値
        It should be    : 58d6426623f10e60aab7e11442e72bb0  ……XMLファイルのハッシュ値


End Verification : 07/27/2005 at 15h55'26



 オプションが豊富なツールなので、詳細については添付のReadMe.txt(英語)ファイルや、サポート技術情報「Availability and description of the File Checksum Integrity Verifier utility」[英語]も参考にしていただきたい。

■関連記事(Windows Server Insider)


■関連リンク


「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。