ポイント

●あるデータをハッシュ関数を使って計算した結果がハッシュ値である。メッセージ・ダイジェスト,フィンガープリント(指紋)とも呼ばれる
●ハッシュ値は基データのサイズに関わらず固定長になる。長さはアルゴリズムによって異なる
●ハッシュ値は「基データが異なれば,その計算結果であるハッシュ値も異なるのが普通で,同じハッシュ値になることはほとんどない」「ハッシュ値とハッシュ関数がわかっても,基のデータを特定できない」という特徴がある

 本連載では,暗号方式に関する話が続いています。今回取り上げる「ハッシュ値」は,厳密に分類すると暗号の仕組みとは異なりますが,暗号方式を学習する時に外すことができない大切な基礎技術です。

ハッシュ値で完全性を確保する

 連載の第1回で情報セキュリティの要素を勉強しました。このうちの機密性・完全性・真正性に着目します。

 インターネットを介して通信する場合,機密性・完全性・真正性を確保するために考えなければならないことを当てはめてみると,次のようになります。

機密性:盗聴されても中身を読み取れないようにする
真正性:送信者が正しいか確認できるようにする
完全性:通信経路上で改ざんされていないことを確認できるようにする

 このうち,機密性は,共通鍵暗号方式や,公開鍵暗号方式などの技術を使って確保します。真正性は,公開鍵暗号方式の署名の仕組みで確保します(詳細は『12. 公開鍵暗号方式[後編]----使い方と特徴』参照)。

 そして完全性を確保するための技術としてハッシュ値が使われます。ハッシュ値のことをメッセージ・ダイジェスト,またはフィンガープリント(指紋)と呼ぶ場合もあります。

ハッシュ値とハッシュ関数

 ところで,情報処理の世界ではテキスト・データであっても画像データであっても,すべてのデータは0と1を組み合わせて表現します。つまり,どんなデータ(ファイル)であっても,一つの数値とみなすことができます。ハッシュ値とは,あるデータ(つまり数値)を,ハッシュ関数と呼ばれる関数で演算した結果です。このとき,ハッシュ値は基のデータのサイズに関わらず,128~512ビット程度の一定の長さになります(長さはアルゴリズムによって異なります)。ハッシュ(hash)という言葉は,「切り刻む,細かくする」という意味があります。基のデータを約束事(アルゴリズム)に従って細かく切り刻んで,一定の長さに整えたものというように,考えておけばよいでしょう。(図1)。

図1 ハッシュ値とは
基のデータ(ビット列)をハッシュ関数という特別な関数を使って計算すると,決まった長さのビット列になる。それがハッシュ値である。

 またハッシュ関数は,以下の二つの特徴を持っています。

●異なる基のデータから同じハッシュ値が得られることはほとんどない
●ハッシュ値とハッシュ関数が分かっていても,基のデータを算出できない