ようこそゲストさん

CPA-LABテクニカル

2008/09/05(金) 電子署名をなんとか理解する

電子署名をプログラマ的に理解する

初心者PHPプログラマが理解した電子署名の理解の仕方をここに記します。
もし、間違ったことを書いていたら、ぜひご指摘ください。


「ある文章」のハッシュ値をとる。
$hash = sha1('「ある文章」');
この$hashを、スポックの秘密鍵で暗号化する。
$hash_angou = himitukagi_de_angou( $hash );
「ある文章」の後に、$hash_angouとスポックの公開鍵を並べたファイル。
それが、署名された文章である。
署名された文章
「ある文章」スポックの公開鍵+スポックの名前$hash_angou
しかし、このままでは、まだ足りない。
「スポックの公開鍵+スポックの名前」を第三者の認証機関にサインしてもらう(S/MIME方式)。
具体的には、
「スポックの公開鍵+スポックの名前」のハッシュ値をとり、認証機関の秘密鍵で暗号化する(暗号化するのは、当然、認証局が行う)
$koukai_name_hash = sha1('スポックの公開鍵+スポックの名前');
$ninshou_kikan_no_angou = himitukagi_de_angou($koukai_name_hash);
それと、認証機関の公開鍵といっしょに並べる。
スポックの電子署名
「ある文章」認証機関の公開鍵 $ninshou_kikan_no_angou$hash_angou
 スポックの公開鍵+スポックの名前

改ざん検知

もし、この「ある文章」が改ざんされていたら検出できる。

「ある文章」のハッシュ値$hash_decodeをとり、$hash_angouをスポックの公開鍵で解読し、$hashを復元する。
$hash_decode == $hash
であれば、改ざんされていない。イコールでなければ、その「ある文章」は搬送途中で改ざんされているので、信頼できない。

この文章はスポックが書いたものと確認できる

そこにスポックという名前が書いてあるからと言って、スポックが書いたとは限らない。誰でも、スポックを名乗ることができるからだ。
しかし、スポックは、認証機関にリアルな世界でスポックであるという免許証などを見せて、その上で、自分の公開鍵を認証機関に署名してもらっている。
だから、、、
「スポックの公開鍵+スポックの名前」のハッシュ値をとり、$ninshou_kikan_no_angouを認証機関の公開鍵で復号したものが一致すれば、それはスポックが、スポックであることを証明することになる。

しかし、認証機関の公開鍵は、そのまま信用していいものだろうか?

そこの解決の仕方が、方式によって様々である。
S/MIME方式では、第三者の認証機関にお金を払って私を認証してもらい、公開鍵をもらっている。
その第三者の認証機関は、マイクロソフトなどのソフトウエア会社に頼んで、予めブラウザやメーラー等に、「信用できる認証機関の公開鍵」として登録してもらっている。それは有名なベリサインなどがそうだ。

だから、その認証機関の公開鍵が信用できるのであって、プリインストールされてない、怪しげな認証機関の公開鍵など信用できない。このプリインストールされていない認証機関の証明書がいわゆる、オレオレ証明書ということだ。

もちろん、プリインストールされていなくても、そのプリインストールされている認証機関から証明書を受けた公開鍵は、信用されるのだから、その信用された公開鍵が、また別の公開鍵の証明をしても問題ない。プリインストールはされていないけれども、信用された公開鍵を使って認証機関を名乗っているのが、中間認証機関というやつだ。通常、プリインストールされている認証機関よりも、認証手数料が安いため、よく利用されるが、その中間認証局の運用がまずいと、トラブルを引き起こすこともある。

無料の認証機関もある

私は無料で私の公開鍵を、通常のパソコンにプリインストールされている認証機関から証明してもらった。私の知る限り、このようなルート証明書を持つ認証機関で無料でやってくれるのは、thawteだけだ。しかも、ネット上だけで完結する。
その取得方法は、無料でデジタル証明書を取得する(1)-@IT がたいへん詳しい。

ただし、無料だからこその制限もある。認証してくれるのは、メールアドレスだけだ。
スポックであるという保証はしてくれない。でも、メールアドレスを認証してくれたら、私のメールアドレスから発信されており、内容は改ざんされていない、ということを保証してくれる。


これだけでも十分に署名の役割を果たす。
スポックの署名ということでなく、スポックのメールアドレスによる署名ということだ。


なお、ベリサインにも、お試しの何十日間かだけ有効の署名をしてくれるサービスがあるようだが、私は試していない。

PGPは、信頼の輪で無料の認証を得る仕組み

PGPには、プリインストールされた認証機関というものはない。
ただ、友達の友達は信頼できる、という仕組みを使って、大きな信頼の輪を作ることで、その公開鍵の信頼性を高める仕組みだ。
しかし、公開鍵を廃止したり、変更する場合に、その信頼の輪に対して、どのようにその廃止・変更
通知を徹底させるか、という問題が残ることになる。

その点、S/MIMEであれば、認証機関が問い合わせが合ったときに、その署名はすでに無効だ、という返事を返せば、廃止・変更した署名を使った不正を防ぐことが出来る。

紙の署名と比べてみる

登記申請や、ちょっとお堅い契約書だと、中身を変更する際には契約書のはしっこに「5文字訂正」などと書いて、さらに全員の印が押してあったりする。そのようにしてハッシュ値の一致のようなことをしているわけだ。
さらに、役所に「印鑑登録」して印鑑証明を発行してもらい、その印影が、スポックのものであると証明してもらっているわけだ。
役所が、プリインストールされた認証機関の役割を果たしている。

もちろん、実世界をインターネットの世界がまねたのだろうけど、実によく似ていて、実によくできた仕組みと思う。

実世界の署名よりも、電子署名の方が、よほど安心できる、と思う。
(それは電子署名の方が偽造が難しいからだ)

Qdmailは

そんなこんなで、Qdmailも、S/MIME方式での署名ができるように改造中。
まもなくリリースします。

参考にさせていただいたサイト

【特集】S/MIMEでセキュアな電子メール環境をつくる!-@IT

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/0175/tb/