2016年2月15日月曜日

Webサービスにおける暗号化の基本 / 暗号化方式

mainpic

最近の開発案件の多くはネットワーク越しにデータを取得したり、データを格納したりすることが多いです。少し昔であれば比較的オンプレミスでのサービス構築も割合多かったですが、今はアプリ、モノ、webサービス同士、非常に多くのものがネットワークに繋がりhttp通信を介して情報の受け渡しを行います。

さて、特に個人情報を取り扱う開発者にとっては最低限の暗号化の知識は必要となります。

なので数日に渡り、https通信に関してまとめていきます。


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

3回程度に分けて以下の内容を説明をしていきます。

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

最後のSSLの仕組みまでくれば、https(http over ssl)の全容が分かった気になれるはずです。

それでは、長い話になりますが1つずつ潰していきましょう。


目的

そもそも相手の顔が直接見えないWeb上で暗号化を行うのは以下の攻撃を防ぐのが目的です。

  • なりすまし
    サイト運営者になりすますこと。
    amazonにアクセスしたつもりが、全然違う業者でだまされてしまったり。

  • 改ざん
    情報の送受信において情報が書き換えられてしまうこと。
    配送先の住所を書き換えられて、商品が届かなくなってしまったり。

  • 盗聴
    情報の送受信において情報を盗み見られてしまうこと。
    クレジットカード情報や住所が盗まれてしまったり。

  • 否認
    自分の行った行為を否定すること。
    商品が到着した後に、自分は買っていないと主張されたり。

さて、最終的にこれらの脅威を防ぐことができるのかも合わせて確認していきましょう。


共通鍵暗号化方式

暗号化と復号化を同じ鍵を用いて行うことを言います。

鍵というと物理的なイメージになってしまいますが、たとえばシーザー暗号(アルファベットを3文字ずつずらす)という方式を使って暗号化・復号化を行うのも同様に共通鍵暗号化方式です。

代表的なもので「DES」や「AES」などがあります。

DESは現在安全ではないため、利用するのは控えた方が無難です

身近なところだと無線LANの暗号化方式の選択の際に出てくることがあります。

さて、この共通鍵暗号化方式には矛盾が存在しています。

それは、

「共通鍵を秘密にして相手に渡せるなら、その方法を使って本来渡したい情報を渡せる」

はずなんです。

この共通鍵の鍵を安全に交換するという概念を変えたのが次に示す公開鍵暗号方式です。

公開鍵暗号化方式

暗号化と復号化を異なる鍵を用いて行うことを言います。

共通鍵暗号化方式では、鍵を隠す方法を模索していましたが、公開鍵暗号方式では鍵を公開する方法になります。

最初の公開鍵暗号はRivest, Shamir, Adlemanの三人の頭文字から「RSA暗号」と名付けられました。

公開鍵暗号方式では、公開可能な「公開鍵」、秘密にしておくべき「秘密鍵」が出てきます。

最大の特徴は

片方の鍵で暗号化したものは、もう一方の鍵でしか復号化できない

ということです。公開鍵で暗号化した場合は秘密鍵で復号化、秘密鍵で暗号化したら公開鍵で復号化を行います。

仕組みは

Created with Raphaël 2.1.2受信者受信者送信者送信者公開鍵・秘密鍵の作成公開鍵を渡すhogehoge text公開鍵で情報を暗号化aefaehflak1jljfa;暗号化された情報を送信aefaehflak1jljfa;秘密鍵で情報を復号化hogehoge text;

送信者ではなく、受信者が公開鍵を渡します。

しかし、安全で強度な公開鍵暗号化方式ですが、処理が複雑であるため遅いというデメリットがあります。一方で、共通鍵暗号化は同じ鍵を用いるため処理が速いです

そこで、この二つを合わせた「ハイブリッド暗号」が使われることがあります。

ハイブリッド暗号は公開鍵暗号化方式で共通鍵を送信することです。

最後に説明するSSLもこの「ハイブリッド暗号」を用いて通信を行います。


鍵の管理者?

これまでの話で、

  • 「共通鍵」 → 秘密
  • 「秘密鍵」 → 秘密
  • 「公開鍵」 → 公開OK

となっています。

さて、今回の暗号化の目的が「なりすまし」、「改ざん」、「盗聴」、「否認」を防ぐことにありました。

公開鍵で暗号化した情報は、秘密鍵でしか復号することができないので「盗聴」は防ぐことが出来ます。

適当な鍵で暗号化し「改ざん」をすることも出来ますが、住所を変更したりといった狙った内容への変更は防ぐことが出来ます。

しかし、これらもまだ完全ではありません。

なぜなら公開鍵の作成者が受信者本人であるかが不明であるからです。

秘密鍵・公開鍵の作成は受信者です

公開鍵が受信者本人のものではなく、第三者の作成したものであれば復号化されてしまいます。
これは「なりすまし」となります。実は「なりすまし」を防がないと他の三つの脅威は防ぐことができません。「なりすまし」とができると、自由に内容を改ざんし、情報を閲覧し、送りたい相手に適切に情報が届かなかったりといったことが起こることになります。

例えば公開鍵暗号化方式しかない世の中で、amazonの傘下だと思っていたamazon.ssというドメインに対して購入手続きなどをした場合は、クレジットカードの情報や住所を悪意のある第三者(amazon.ssの管理者)に取られてしまうかもしれません。

amazon.ssというのは架空のサイトですw
大手サービスは大半のドメインを取得済みで本体のwebサイトにリンクされます。
例) amazon.link → amazon.com、google.jp → google.co.jpなど

情報を送信したい相手が、そもそも相手本人なのかどうかというのを解決する必要があります。

ということで次回以降でその辺も明らかにしていきます。

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

0 件のコメント:

コメントを投稿