2016年2月16日火曜日

Webサービスにおける暗号化の基本 / デジタル署名

mainpic

前回の記事ではWebサービスにおける暗号化の基礎として、共通鍵と公開鍵の話をまとめました。

共通鍵は同じ鍵を使って暗号通信を行う。
公開鍵はデータ受信者が秘密鍵・公開鍵作成し、暗号通信を行うということでした。

しかし、強固に見える公開鍵暗号化方式でも「送信者が意図した受信者かどうか」を確かめる術がなく、「なりすまし」を防ぐことが出来ません。

また、同様に受信者側から見ても送信者が本当に自分の知っている送信者なのかを確かめることが出来ません。

そこで、引き続きその後に続く暗号化の周辺知識を足していきます。


Webサービス開発における暗号化の基本

第二回目の今回は、

  1. 共通鍵暗号化方式
  2. 公開鍵暗号化方式
  3. デジタル署名(電子署名)(今日はここまで)
  4. 電子証明書
  5. 認証局
  6. オレオレ証明書
  7. SSLの仕組み

署名に関して書いていきます。


デジタル署名(電子署名)

インターネット上で自分が自分であることを証明する「署名(サイン)」です。

メールに付けて送信する方もいらっしゃいますね。

概念としては実世界と同じように、本人筆跡のサインや捺印というものと同じイメージです。大切な書類を発行してもらうときに発行元がサインしたりしますよね。そのようなイメージです。

厳密には、紙面上でのサインを代替する技術の総称を「電子署名」と呼び、デジタル署名は電子署名技術の一つです。

このデジタル署名自体は暗号化ではなく、送信したい情報に添付するただの署名であるということを覚えておいてください。

仕組み自体は非常に簡単です。

デジタル署名の流れは公開鍵暗号化方式の応用で、自分の秘密鍵で暗号化した乱数(メッセージダイジェスト、後述)を相手に送信することです。

すると、相手はあなたの公開鍵を使い暗号化された乱数を復号化することができます。あなたの公開鍵できちんの復号化されたならば、それを送信してきたのは秘密鍵を持っているあなたに間違いないということです。

これによって、「なりすまし」、「改ざん」、「盗聴」、「否認」のうちの一つ、「否認」を防ぐことができます。

なぜなら、送信者が本人であるという証明が送付され、それが受信者側で確認されたためです。

この流れの中にある、自分の秘密鍵で暗号化した乱数のことをデジタル署名と言います。

この乱数はただの乱数ではなく、メッセージダイジェストと呼ばれる送信したい内容から「ハッシュ関数」という単方向関数(不可逆)を用いて作成したビットデータです。


メッセージダイジェストについて

適当な例をあげるとすれば

Hello World!! (送信したい情報)

↓ ハッシュ関数適用!

0101011010110110000111 (メッセージダイジェスト)

という感じです。

メッセージダイジェストには
1. 不可逆の変換であり、原文を復元できない
2. 1bitでも異なると異なる値を出力する
3. 同じハッシュ値を持つデータを作成することは難しい。
という3つの特徴があります。


デジタル署名の流れ

メッセージダイジェストの特徴を利用して以下の流れのように署名が行われます。

Created with Raphaël 2.1.2送信者送信者受信者受信者本文: "Hello"Helloにハッシュ関数適用 → 01100111本文: "Hello"、MD: 0110011101100111を秘密鍵で暗号化Hello + デジタル署名 + 公開鍵Hello + デジタル署名 + 公開鍵公開鍵でデジタル署名を復号化本文: "Hello"、MD: 01100111Helloにハッシュ関数適用 → 01100111作成したハッシュ値と送信されたハッシュ値が同じことを確認

実は、情報の内容が1bitでも異なるというメッセージダイジェストの特徴から、「改ざん」を防ぐこともできます。もし「改ざん」が行われていると送信されたハッシュ値自分が本文から作成したハッシュ値に差異が生じるためです。

以上がデジタル署名の流れとなります。


それでもまだ足りない。

実は結果から言うと、デジタル署名では脅威である「なりすまし」、「改ざん」、「盗聴」、「否認」のうち「なりすまし」を防ぐことは出来ず、前回の記事と同じ問題を抱えたままです。

どういうことかと言うと、proxyなどを介して全ての通信を盗む悪人がいるとすると、送信者の情報を抜き、改ざんし、デジタル署名を破棄し、悪人が送信者のふりをしたデジタル署名を付け、全く別な情報を受信者に送信する。

という事ができてしまいます。受信者から見ると、意図した送信者かどうかを判断することはできないのです。

流れはこんな感じです。

Created with Raphaël 2.1.2送信者送信者悪人悪人受信者受信者Hello + デジタル署名 + 公開鍵Hello → ByeByeデジタル署名 → 'デジタル署名公開鍵 → '公開鍵ByeBye + 'デジタル署名 + '公開鍵ByeBye 'デジタル署名 '公開鍵ハッシュ値が一致してしまう

デジタル署名を使っても

公開鍵の作成者が受信者本人であるかが不明

という状況は変わらないため、これを解決する必要があります。

それを解決するのが次回説明する電子証明書と認証局という仕組みになります。

今日は以上です!

では、良いインプットと良いプログラミングを。

0 件のコメント:

コメントを投稿