写真1 md5コマンドの出力結果。似たようなデータ「1000」,「1001」が全く異なるハッシュ値を出力すること,元データの長さが異なっても同じ長さのハッシュ値が得られることが分かる。
写真1 md5コマンドの出力結果。似たようなデータ「1000」,「1001」が全く異なるハッシュ値を出力すること,元データの長さが異なっても同じ長さのハッシュ値が得られることが分かる。
[画像のクリックで拡大表示]

 ハッシュとは,データの比較・検証に役立つソフトウエア技術である。ファイルが正しくコピーされたかどうか,改ざんを受けていないかなどを確認するために広く使われている。多くのLinuxディストリビューションには,データからハッシュ技術を用いて生成するハッシュ値を導き出す2種類のコマンド,md5sumとsha1sumが収録されている。

 このため,Linuxディストリビューション配布用のISOファイルには,md5sumあるいはsha1sumによって生成されたハッシュ値が併せて公開されている場合が多い。ハッシュ値自体をハッシュと呼ぶこともある。

 FTPサイトなどから入手したファイルが正しくダウンロードされた(オリジナルと等しい)ことを証明するには,バイト列の並びがオリジナルと同一であることを確認する必要がある。しかし,直接バイト列を比較しようとすると,同じファイルをもう一度ダウンロードしなければならない。これではダウンロード時間が2倍になってしまう。ファイル・サイズが大きいISOファイルなどでは現実的ではない。

 ここで役立つのがハッシュ値だ。md5sumコマンドなどには,あるバイト列からあらかじめ決められた長さの別のバイト列に変換するハッシュ関数が組み込まれている。例えば,md5sumに内蔵されたハッシュ関数は,どのような長さのバイト列であっても128ビット(16バイト)の文字列を出力する(写真1)。sha1sumでは160ビット(20バイト)だ。データの検証に必要なデータが小さく,ダウンロード時間に影響を与えない。

 データを検証する方法には,ハッシュ関数以外にもさまざまな方法が利用されてきた。例えば,ファイル・サイズやファイルの末尾や先頭の一定のバイトだけを取り出して確認するなどの手法である。しかし,ファイル・サイズを検証した場合,データ全量を取得できたことは分かるが,通信エラーなどで内容が一部変化していたとしても検出できない。ファイルの一部分を取り出す方法も同じだ。

 ファイルの全バイトを足し合わせて得られた和の末尾のバイトを,チェック・サムと呼ぶ。チェック・サムは1バイトだけに異常がある場合には確実に検出できるが,数バイトに異常があり,たまたま変化が互いに打ち消す方向に起こった場合は検出できない。元ファイルから取り出すバイト数を増やしたり,チェック・サムのけた数を増やせばエラーを検出する確率が高まるが,データ数をかなり増やしても信頼性がなかなか向上しない。

 もう一つの問題は,ファイルの一部を取り出したり,チェック・サムを用いる方法では,ウイルス感染を含むデータの改ざんを検出しにくいことだ。改ざん後のチェック・サムを元のファイルと同一に保つのはごく簡単な手順で実行できる。

 以上の問題点を解決するのがハッシュだ。ハッシュにも限界があり,異なる元データから同一のハッシュ値が得られることはある。しかし,チェック・サムを調整するような簡単な手順では同一のハッシュ値が得られないように工夫されている。偶然のエラーによって同一のハッシュ値にならないよう,似通ったデータから似たようなハッシュ値が生成されない。さらに,元データが長くても一定の長さのハッシュ値が得られ,ハッシュ値が,できるだけばらつくように設計されている。