« CCIEを取るぞ~ | メイン | Internet Week 2003 (・∀・)イイ!! »

ハッシュ関数について

セキュリティー関連の話しになると、とりあえず出てくるのがハッシュ関数。ハッシュ関数として有名なのはMD5、SHA-1でしょう。

ダウンロードしたファイルの改ざん検知、PPPの認証、デジタル署名など、至る所で使われているのでございますが、本を読んで新しくわかったことなどありますので、メモ代わりに掲載しますので興味のあるかたはご覧くださいまし。(注意:たいした事は書いていません)

昨日、自分の作って保存しておいたファイルが、今あるファイルと同じかどうか?
要するに、誰かが勝手に書き換えていないかどうか?
この同じかどうか、本物かどうかと言うことを「正真性」(integrity)、あるいは「完全性」と言います。

この、ファイルの正真性を調べるのにハッシュ関数が使われます。

この正真性を調べる方法は2つあります。
1,自分の作っておいたファイルを別の場所に保存しておいて、今あるファイルと、保存しておいたファイルを比べ、同じなら改ざんされていない。
この方法は、ダメですね。。。。そもそも自分のファイルを安全に保存出来るのであれば、正真性を調べる必要性がありません。。

2,ハッシュ関数を使う。
ファイルからSHA-1やMD5と言うMD5を使い、ハッシュ値を出し、そのハッシュ値同士を比較する。
ハッシュ値なら小さいサイズなので、管理、比較が非常に楽ちん。

以降は、ハッシュ関数の特徴を見ていきます。


1方向ハッシュ関数を、
・メッセージダイジェスト関数
・メッセージ要約関数
・暗号的」ハッシュ関数
と呼ぶことがあります。

1方向ハッシュ関数(one-way hash function)には、入力と出力がある。
・入力のことを「メッセージ」(message)と言う
もしくは、プレ・イメージ(pre-image)とも呼ばれる

・出力のことを「ハッシュ値」(hash value)と言う
もしくは、メッセージダイジェスト(message digest)、フィンガープリント(fingerprint)とも呼ばれる

ハッシュ値のサイズは、元の値(メッセージ)とは無関係でメッセージが1ビットでも1メガバイトでも、ハッシュ値は固定長のサイズになります。MD5は128bit、SHA-1は160bitです。

MD5は、128bitのハッシュ値をもつ、1991年にRivestが作った1方向ハッシュ関数です(RFC1321)
完全には破られているわけでありませんが、内部構造の1部に対する攻撃方法がいくつか発見されているらしい。

SHA-1は、160bitのハッシュ値をもつ、NIST(National Institute of Standards nad Technology)で作られた。
1993年にアメリカの連邦情報処理標準規格(FIPS PUB 180)として発表されたものをSHAと呼び、1995年に発表された改訂版FIPS PUB 180-1をSHA-1と呼びます。
他にも、SHA-256(ハッシュ値が256bit)、SHA-384(ハッシュ値が384bit)、SHA-512(ハッシュ値が512bit)などがあり、これらをSHA-2と呼ぶ。

ハッシュ関数の特徴として、元のメッセージが1ビットでも変化したら、ハッシュ値は非常に高い確率で異なる値にならないといけません。このメッセージが異なっているのに同じハッシュ値になることを「衝突」(collision)と言います。
この衝突を簡単に見つけられると、えらいこっちゃとなります。
衝突を見つけるのが困難な性質のことを、衝突耐性(collision resistance)と言います。

以降は、1方向ハッシュ関数への攻撃を見ていきます。


ファイルを書き換えると、元のファイルのハッシュ値と、変更後のファイルのハッシュ値は通常は別のハッシュ値になります。このおかげで改ざんを検知出来ます。
しかし、色々書き換えていくと、いつか元のファイルのハッシュ値と書き換えたファイルのハッシュ値が同じハッシュ値なるときがあるかもしれません。その場合、改ざんが成功となります。
このような攻撃を、「ブルート・フォース・アタック」と言います。

SHA-1の場合、このフルート・フォース・アタックで改ざんを成功させるには、ハッシュ値の長さの回数、2の160乗やれば必ず成功します。
2の160乗の回数をやるってのは、尋常ではありません。

このような性質上、ハッシュ関数は、ハッシュ関数の長さが長いほど安全性が高いと言えます。


上記の方法とは別に、「誕生日攻撃」(birthday attack)と言うものもあります。
これは、ハッシュ関数の「強衝突耐性」をつく攻撃です。

例えば、元のファイルを攻撃者が作って、それを攻撃したい人に渡しておきます。
攻撃者は、元のファイルと内容は違うのですが、同じハッシュ値を持つファイルも用意しておきます。
で、こそっと内容は違うが同じハッシュ値を持つファイルに変更しておけば、ハッシュ値は同じなので気づかれる心配はありません。

要するに、ハッシュ値自体は何でもいいが、とにかく同じハッシュ値を持つ異なるメッセージを見つけると言う攻撃方法です。

この、ハッシュ値自体は何でもいいから、同じハッシュ値を持つ異なるメッセージが存在する確立は、SHA-1で2の80乗となります。要するに、ブルート・フォース・アタックより、格段に安全性がおちるということです。


さらに詳しいことは、
「暗号技術入門 秘密の国のアリス」
著:結城 浩
を読んでください。

様々な暗号技術を分かりやすく解説してくださっている本ですので、おすすめです。

 

トラックバック

このエントリーのトラックバックURL:
http://gogokeiji.com/mt/mt-tb.cgi/22

コメントを投稿

About

2004年08月01日 00:12に投稿されたエントリーのページです。

ひとつ前の投稿は「CCIEを取るぞ~」です。

次の投稿は「Internet Week 2003 (・∀・)イイ!!」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Creative Commons License
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.