メッセージダイジェスト
[Wikipedia|▼Menu]
暗号学的ハッシュ関数の、入力と出力の変化のようすの模式図。入力がわずかに変化しただけでも、出力は全く異なったものになる

暗号学的ハッシュ関数(あんごうがくてきハッシュかんすう、: cryptographic hash function)は、ハッシュ関数のうち、暗号など情報セキュリティの用途に適する暗号数理的性質をもつもの。任意の長さの入力を(通常は)固定長の出力に変換する。

「メッセージダイジェスト」は、暗号学的ハッシュ関数の多数ある応用のひとつであり、メールなどの「メッセージ」のビット列から暗号学的ハッシュ関数によって得たハッシュ値を、そのメッセージの内容を保証する「ダイジェスト」として利用するものである。
要求される性質

暗号学的ハッシュ関数には、一般的なハッシュ関数に望まれる性質や、決定的であることの他、次のような暗号学的な性質が要求される。

ハッシュ値から、そのようなハッシュ値となるメッセージを得ることが(事実上)不可能であること(原像計算困難性、弱衝突耐性)。

同じハッシュ値となる、異なる2つのメッセージのペアを求めることが(事実上)不可能であること(強衝突耐性)。

メッセージをほんの少し変えたとき、ハッシュ値は大幅に変わり、元のメッセージのハッシュ値とは相関がないように見えること。

暗号学的ハッシュ関数は情報セキュリティ分野で様々に利用されている。たとえば、デジタル署名メッセージ認証符号 (MAC)、その他の認証技術などである。目的によって要求される性質はそれぞれ異なる。

一般に通常のハッシュ関数と比べ、長い(最低でも100ビット程度)ハッシュ値が必要であり必要な計算も多いが、メッセージのチェックなどの目的に使われることからそういった用途では高速に計算できるほうが望ましい。一方、パスワードハッシュなどの用途では、ハッシュ値を求める計算が重い(遅い)ことが必要である。この場合には、ハッシュ値のハッシュ値を何度も求める「ストレッチング」などの技法を用いるか、そういった目的に適するように設計された特別な鍵導出関数、たとえばbcryptを用いる。通常のハッシュ関数として、ハッシュテーブルのインデックス、フィンガープリント、重複データの検出、ファイルの一意な識別、データの誤りを検出するチェックサムなどにも利用できるが、通常のハッシュ関数と比べて計算が重い点で、必ずしも適していない。

なお「(事実上)」とは、探索しなければならない対象が数え上げ可能なために[注 1]総当たり攻撃ができるため、実際には探索の計算に必要な時間が現実的に十分に長いかどうか、という意味だからである。理想的には一方向性関数であれば良いのだが、一方向性であるという保証のある(一方向性であると証明された)ハッシュ関数はまだ得られておらず、そもそも数理的にそれが存在するか否かもわかっていない。現状では、構成法が広く暗号研究者に知られていて攻撃法が研究されており、かつ、効果的・効率的な攻撃法が発見されていないハッシュ関数であれば安全であろう、とみなされて運用されている。もし理想的なハッシュ関数があったとしたなら、暗号学的には、総当たり攻撃(および誕生日攻撃)以外には攻撃法が無いということになる。
特性

以上のような要求される性質にもとづき、暗号学的ハッシュ関数の特性について、もう少し詳細に説明する。

暗号学的ハッシュ関数は、任意長のビット列を入力とし、固定長のビット列を出力とする。その出力が「入力に対するハッシュ値」である。2019年現在の時点では、多くのコンピュータシステムがデータ量としてオクテット単位であるため、オクテット列を入力としている実装がもっぱらではある。

暗号学的ハッシュ関数には、少なくとも次のような特性が必須である。
原像攻撃の難しさ

原像計算困難性 (preimage resistance)
ハッシュ値 h が与えられたとき、そこから h = hash(m) となるような任意のメッセージ m を探すことが困難でなければならない。これは一方向性関数の原像計算困難性に関連している。この特性がない関数は(第1)原像攻撃に対して脆弱である。
第2原像計算困難性
入力 m1 が与えられたとき、h = hash(m1) = hash(m2) となる(すなわち、衝突する)ような別の入力 m2(m1とは異なる入力)を見つけることが困難でなければならない。これを「弱衝突耐性」ともいう。この特性がない関数は、第2原像攻撃に対して脆弱である。(第1)原像攻撃と異なり、h を単純に固定するのではなく m1 のハッシュ値となるように固定する。
誕生日攻撃の難しさ

強衝突耐性
h = hash(m1) = hash(m2) となるような2つの異なるメッセージ m1 と m2 を探し出すことが困難でなければならない。第2原像計算困難性と異なる点として、h は任意に選んでよい。一般に誕生日のパラドックス[注 2]によって、強衝突耐性を持つためには、原像計算困難性を持つために必要なハッシュ値の2倍の長さのハッシュ値が必要である。

これらの特性は、悪意ある攻撃者でもダイジェストを変化させずに入力データを改竄できないことを示すものである。したがって、2つの文字列のダイジェストが同じ場合、それらが同一のメッセージである可能性は非常に高い。

これらの基準に適合した関数でも、好ましくない特性をもつものがありうる。現在よく使われている暗号学的ハッシュ関数は伸長攻撃に対して脆弱である。すなわち、ハッシュ値 h(m) とメッセージ長 len(m) が分かっていて m そのものは不明の場合、適当な m' を選んで h (m |。m') が計算できる。ここで、|。はメッセージの連結を意味する。この特性を利用して、ハッシュ関数に基づく単純な認証方式を破ることが可能である。HMACはこの問題への対策として考案された。

理想的には、さらに強い条件を課すこともできる。例えば、悪意ある者が非常によく似たダイジェストを生成する2つのメッセージを見つけることができないのが望ましい。また、ダイジェストだけから元のデータについて何らかの有用な情報を推測できないのが望ましい。これはある意味で、暗号学的ハッシュ関数は疑似乱数列を生成する関数(特に、暗号論的擬似乱数生成器)の関数に似ているといえる。しかし、決定性と計算効率は維持しなければならず、疑似乱数列生成系においては通常必要とされる最長周期の保証といった特性は、暗号学的ハッシュ関数にはない。

単純なチェックサムはもとより、巡回冗長検査 (CRC) などの誤り検出符号も、上で説明したような攻撃への耐性はなく、暗号的な目的には不適である。例えば、CRCがWEPでのデータ完全性保証に使われていたので、チェックサムの線形性を利用した攻撃が可能となった。



用途

暗号学的ハッシュ関数の典型的な利用例を以下に示す。アリスは難しい数学問題をボブに提示し、彼女自身はそれを解いたと主張する。ボブも解いてみるが、その前にアリスがはったりをかましていないことを確認したい。このときアリスは、自分の解答にランダムな文字列 (nonce) を付けてそのハッシュ値を計算し、ボブにハッシュ値を知らせる(この時点では解答そのものとnonceは秘密にしておく)。何日かしてボブがその問題を解いたら、アリスはnonceと自分の解答をボブに示すことで、既にその問題を解いていたことが証明できる。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:36 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef