デジタル署名で否認防止をする

皆さん、こんにちは。技術開発グループのn-ozawanです。
早いもので11月ですね。暖かいので11月になった感じがしません。

本題です。
JWTなど、SSL/TLS以外でもデジタル署名という言葉をよく聞きます。署名というからにはハンコみたいなもの?どうやってデータにハンコ押すの?と、漠然と考えている方も多いのではないでしょうか。今回はそんなデジタル署名についてお話しします。

デジタル署名

概要

デジタル署名は印鑑の捺印やサインに相当するものと言われています。このデータは間違いなく私が送信したものです、とサインするイメージです。これにより、真正性や完全性に加えて、否認防止にもなります。

デジタル署名では以下2つの特性が必要となります。

  1. 送信者がメッセージに対して、署名を生成する。
  2. 受信者がメッセージに対して、署名を検証する。

送信者アリスはメッセージに対して署名をします。この署名はアリスのみが行える必要があります。例えば攻撃者マロニーがアリス名義で署名出来てしまっては意味がありません。

受信者ボブは、アリスから受け取ったメッセージに対して署名の検証を行います。この検証は、間違いなくアリスが署名したものである、ということを立証するためのものです。また、この検証はボブ以外の人でも出来るようにする必要があります。

RSA公開鍵暗号方式を利用したデジタル署名

先ほどのデジタル署名で求められる2つの特性を実現するためにRSA公開鍵暗号方式が広く利用されています。RSAによるデジタル署名では主に以下の流れになります。

  1. 送信者アリスは、RSAの秘密鍵と公開鍵を用意する。
  2. 送信者アリスは、送信するメッセージからハッシュ値を取得する。
  3. 送信者アリスは、ハッシュ値に対してRSA復号化を行うことにより、署名を生成する。
  4. 送信者アリスは、ボブへ、メッセージと署名、公開鍵を送信する。
  5. 受信者ボブは、受信したメッセージからハッシュ値を取得する。
  6. 受信者ボブは、署名をRSA暗号化することにより、署名を検証する。
    RSA暗号化によりアリスが生成したハッシュ値が得られるので、ボブが生成したハッシュ値と一致するかどうかを確認する。

復号化で署名を作成して、暗号化で署名を検証する?

暗号化されていないハッシュ値を「復号化する」という表現は、なんだかムズムズしますね。同じく、署名を「暗号化」することでハッシュ値を得ることも違和感があります。これにはちょっとした理由があります。ここでRSAの復号化と暗号化の計算式を確認しましょう。

復号化:平文D mod N
暗号化:平文E mod N

上記の式では、EとNが公開鍵で、Dが秘密鍵です。デジタル署名の特性でも述べた通り、署名をする際は、アリス以外の第3者がアリス名義で署名することは出来ません。なのでアリスは秘密鍵で署名することになります。RSAでは秘密鍵を利用した計算式は「復号化」の計算式となっていますので、署名するときはRSA復号化処理を行うことになります。暗号化も同じ理由です。

正直な話、暗号化も復号化も同じ計算式なので、「RSAの暗号化で署名する」という表現でも間違っていないと思います。実際、多くのサイトでは「RSAの暗号化で署名する」という表現になっていますね。なので、送信者アリスが秘密鍵で署名する、と理解できれば良いかと思います。

否認防止とデジタル署名の問題点

デジタル署名では、送信者アリスが秘密鍵で署名することにより、第3者が署名を偽造することを防ぎます。つまり、いくらアリスが送信したことを否認しても、その署名はアリス本人しか作成できないので、否認防止に繋がります。ただし、これはアリスが秘密鍵を自分自身だけが持っていることが前提となります。もし、秘密鍵が漏洩した場合、第3者が署名を偽造することが可能となり、否認防止性はなくなります。

デジタル署名の多くはRSA公開鍵暗号方式を利用しています。公開鍵暗号方式を利用するということは、なりすましの問題が残るということです。実は、デジタル署名だけではなりすまし問題は解消されません。デジタル署名とは別に、信頼できる第3者機関による、秘密鍵と公開鍵の厳密な管理が必要となります。

おわりに

これまで公開鍵暗号などでお話ししたとおり、アルゴリズムだけでは、なりすましの問題を解消するには中々に難しいものがあります。信頼できる第3者機関が、「この公開鍵は確かにこの人のものだよ」と客観的に証明してくれる証明書が必要になります。

ではまた。

Recommendおすすめブログ