XML署名(5)  ハッシュ値を使う

2004年10月24日(日)更新


■元のデータに電子署名するときの問題

たけち: 前回は電子署名ってどんなものかを簡単にみたね。

さらら: えぇ、元のデータ(この場合、メッセージとも言います)といっしょに、元のデータを秘密鍵で暗号化して渡すのだっだわね。

たけち: そうだったね。でも、元のデータが大きなサイズのデータだったら大変だと思うでしょ。

さらら: えっ? あっ、そう言われればそうねぇ。。。元のデータとほぼ同じサイズの署名データを一緒に送んなくちゃいけないものね。

たけち: それだけじゃなくって、元のデータサイズが大きい場合、次のような問題もあるよね。

  • 元のデータからの署名データ生成に時間がかかる
  • 署名データの複合に時間がかかる

さらら: そうなんだぁ。

たけち: うん。公開鍵暗号の処理はすごく時間がかかるんだよね。

さらら: じゃあ、どうするの?


■ハッシュ値を暗号化する

たけち: うん。元のデータの代わりに元のデータのハッシュ値を使うんだよ。

さらら: ハッシュ値?

たけち: ハッシュ値は元のデータから、ある計算をして求めるんだ。ハッシュ値を使って署名する方法だと、元のデータそのものに電子署名するよりもずっと電子署名の性能や送受信するデータ量が削減できるんだよ。

さらら: そうなんだぁ。


■ハッシュ(hash)値

たけち: ここで簡単にハッシュ値ってどんなものかを見ておこうね。

さらら: はい。

たけち: あるデータから特別な計算をして求めた固定長の値をハッシュ(hash)値と言うんだ。そして、このハッシュ値を計算する計算方法(アルゴリズム)をハッシュ関数と言うんだよ。

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

さらら: ふ〜ん。そのハッシュ値は元のデータと同じように考えていいものなの?

たけち: うっ、うん。。うまく説明できてるかどうかは分かんないけど、ハッシュ関数がどんなものかによるんだろうね。

さらら: どういうこと?

たけち: たとえば、ものすごく簡単な例として、つぎのようなハッシュ関数を考えてみようか。

  • 元のデータの値を12で割った余りを計算し、ハッシュ値として0〜11までの数値をとる。

たけち: どう?

簡単なハッシュ関数では、使い物になりません

さらら: そうね。こんなんじゃ、色々なデータから同じハッシュ値が作られるからだめだわね。

たけち: そうなんだね。だから実際には、ハッシュ値から簡単には元のデータを求められないように、いくつかのハッシュ関数が提案され、実際に使われているんだよ。一部を簡単に紹介しておくね。

MD4, MD5
Rivestという人が作った、128ビット長のハッシュ値を生成するハッシュ関数。MDはMessage Digestの略。現在は推奨されていません。
SHA-1
NIST(National Institute of Standards and Technology)が作った、160ビット長のハッシュ値を生成するハッシュ関数。このほかに、256ビット長ハッシュ値のSHA-256、512ビット長ハッシュ値のSHA-512などがあります。

さらら: そうなんだぁ。

たけち: ちなみにハッシュ(hash)値のことをメッセージダイジェスト(message digest)とも言うからね。

さらら: はい。


■ハッシュ値を使って電子署名する方法

たけち: ある文書のハッシュ値を暗号化して(署名をして)必要な人に渡し、受け取った人がその署名を確認するには、たとえば、次のような流れになるね。

文書のハッシュ値を使っての電子署名と署名の確認

たけち: もし、受け取り側で、比較したハッシュ値が異なる場合には、署名が正しくないか、誰かに元のデータが書き換えられたと判断するんだね。

さらら: そっか。これだと、元のデータよりずっと短いデータを使って署名を確認できるってわけね。なんとなく分かったわ。

たけち: じゃあ、今回はここまでね。そろそろ本題のXML署名の話に移りたいね。

さらら: はい。ありがと。

→次回はXML署名の概要_1です。 (^ ^;