PR

電子署名の仕組み

 HMACは,通信者AとBの間で改ざんを防止します。しかし,共有鍵を持っている人しか検証できませんし,認証機能もありません。そこで,送るデータのハッシュの暗号化に,秘密鍵を使うようにします。

 図6のように,メッセージ送信者Aliceは,送るデータのハッシュ値を自分の秘密鍵で暗号化してメッセージに付加します。この付加された暗号文を電子署名といいます。メッセージを受信したBobは,そのメッセージのハッシュ値を計算します。そして電子署名をAliceの公開鍵で復号化して,ハッシュ値と比較します。一致すれば,そのメッセージは改ざんされておらず,しかもAliceその人が書いたものだと分かります。

図7●電子署名にハッシュを使う
図6●電子署名にハッシュを使う
[画像のクリックで拡大表示]

 公開鍵暗号は複雑な計算をするために,処理に時間がかかります。情報の秘匿が必要ではく,完全性の保証(改ざんされていないことが確認できること)と,送信者認証が必要なら,メッセージそのものを暗号化するのではなく,このようにメッセージのハッシュ値を暗号化するだけで十分なのです。

Javaアプレットに署名する

 Javaアプレットはサーバーからクライアントに送り込まれ,クライアント側のWebブラウザで動作するソフトウエアです。インタラクティブなページを実現するのに使われています。

 しかし,知らない人から送られてきたプログラムを自分のコンピュータで実行するのは不安です。そのためJavaアプレットは,画面とキーボード以外の入出力装置にデフォルトではアクセスできないようになっています。この制限をSandBox(砂場)モデルといいます。確かに,インターネットのどこかに,ハード・ディスクをフォーマットするJavaアプレットが置かれていたら,非常に危険です。

 しかし,その制限は多くの場合,邪魔になります。ハード・ディスクやプリンタなどの外部リソースにアクセスできなければ不便です。そこで,このSandBoxの制限を外すために電子署名が使われるのです。きちんと署名されていれば,そのJavaアプレットは信頼できるものとして,ハード・ディスクの読み書きを許可されるわけです。

 検証はブラウザ側で行います。Javaアプレットは,クラス・ファイル(アプレット本体),電子署名であるハッシュ値を秘密鍵で暗号化したもの,開発者の公開鍵__が1つのjarファイルにまとめられて一括でダウンロードされます(図7)。受信者側では送られてきたクラス・ファイルのハッシュ値を計算します。JavaアプレットではMD5,SHA-1の両方が使われているようです。

図8●Jarファイルの構造
図7●Jarファイルの構造

 また一方で,送られてきた暗号化ハッシュ(電子署名)を公開鍵で復号化します。そして先に計算したハッシュ値と復号化されたハッシュ値が一致していれば,検証が完了して外部リソースへのアクセスが可能になるというわけです(図8)。

図9●Javaアプレットの検証
図8●Javaアプレットの検証

 ここで皆さんには,共有鍵暗号のときと似た疑問がわきませんか。送られてきた公開鍵は,本当に信用できるものなのだろうか?ということです。Javaアプレット制作者はどのようにして安全に公開鍵を利用者まで届けるのでしょう。また利用者は,得られた公開鍵をどのようにしてJavaアプレット制作者のものとして信用できるのでしょう。これを可能にするのが「PKI」という仕組みです。次回はPKIについて解説します。