新卒から文系エンジニア→人材業界に転職した人のブログ

新卒から文系エンジニア→人材業界に転職。技術・スキルがないためブログを通して勉強。その後、IT業界の業界知識が活かせる人材業界へ。異業種×異職種の転職経験有り。

このエントリーをはてなブックマークに追加

【セキュリティ】Web通信における基本的な暗号化について

【今回の紹介】

 10月の応用情報に向けて学習を行っています。
 その中でも、セキュリティについての学習メモを残しておきます。

以下のサイトが大変参考になりました。
暗号化の話
WEB暗号化基礎知識最速マスター
RSA暗号



【内容】

Web上にてクライアントとサーバとのやり取りにおいて
大きく分けて2種類の暗号化を用いた通信方法がある。

Web通信のセキュリティにおいて防止するのは具体的には
 a.通信の盗聴
 b.通信のなりすまし
 c.通信内容の改ざん



a.通信の盗聴野対策


 ■共通鍵方式
  クライアントとサーバで一対の鍵を用意する。その1つの鍵で、暗号化、複合化を行う
  特徴
   ①クライアントとサーバで一対の鍵を用意する必要があるため、通信相手が多いと鍵の管理が煩雑になる
   ②公開鍵方式に比べて暗号化・複合化が簡易で、早い
   ③初回にどうやって相手に暗号化・複合化に使用するアルゴリズムを安全に伝えるか



 ■公開鍵方式
  通信を行う端末に公開する鍵と秘密にする鍵を持つ。
  通常の通信では、公開している鍵で暗号化したものを送信してもらい、
  それに対し、自分が持っている秘密鍵で複合する。
  特徴
   ①クライアントとサーバで一対の鍵を用意する必要がないため、鍵の管理が楽。
    通信が相手がnでも、公開鍵と秘密鍵を1つずつもてばよい
   ②暗号化と複合化が共通鍵方式に比べて、時間がかかる
  


 ■ハイブリット方式
  共通鍵の早さで通信を行いたい。だが、初回の共通鍵の受け渡しも安全に行いたい
  場合に行われている。
   ①使用したい共通鍵を相手の公開鍵で暗号化する
   ②①を相手に通信する
   ③相手は自分の秘密鍵で、公開鍵で暗号化された共通鍵を取り出す
   ④以降、共通鍵を用いて通信を行う
  特徴
  ①共通鍵方式と公開鍵方式の良さをいかした通信手段
  ②初回の共通鍵の受け渡しのリスクがなく、かつ通信の速度も保つ



b.通信のなりすまし対策


 ディジタル署名
 公開鍵方式を使用して、メッセージが送られきたときに「送信相手がだれか」ということは
 証明するものはなにもない。そこで使用されるのが署名。
 主にサーバがあらかじめ公開鍵証明書を外部の認証局から取得しておき、
 それを通信のさいに、クライアントに確認してもらう。
 それにより、クライアントの通信相手が想定するサーバであることを確認できる

 ながれは、
 ①平文をハッシュ値により短くし、サーバの秘密鍵で暗号化する
 ②①の文書をクライアントに送付する
 ③クライアントはサーバの公開鍵を使用して、平文を入手する
 ④クライアントは同封されているハッシュ値で変換して、③で複合化した内容と一致するかを確かめる
 ⑤上記の流れによって、通信のなりすましと通信内容の改ざんを防止できる



【メモ】

■公開鍵方式の公開鍵は公開して問題ないか
 暗号化に用いる鍵を公開鍵として公開していいのかと思うが、
 暗号化するためのキーであり問題ない。
 また、公開鍵で暗合した情報が盗聴された場合も、
 そこから取り出せるのは、公開鍵と公開鍵で暗号化された情報のみ。
 公開鍵で暗号化された情報は、受信者がもつ秘密鍵にての複合化可能なため問題ない




■共通鍵と公開鍵はどのくらい通信速度に差があるのか
  一般的には数百倍から数千倍遅いらしい




■「公開鍵方式の鍵について」
 共通鍵のように複合化と暗号化のキーが同じものなら簡単に想像がつく
 現実世界で言うとドアの鍵とか、、 
 では、暗号化と複合化に使われるキーが異なるとはどういうことか。
 それは、
 ・一つの問いに対して、解が1つ。
 ・問いが公開されているのも関わらず、それを解くことができない。
 ・解から簡単に問いを作成できること
 がよい。ということで、現実には
 
 巨大な二つの素数を掛け合わせた数を素因数分解するには、膨大な時間がかかるということを根拠に、それが利用されています。
 巨大な二つの素数を掛け合わせた数を効率的に素因数分解する方法は、現在でもまだ見つかっていないそうです。
 逆にこの「巨大な二つの素数を掛け合わせた数を効率的に素因数分解する方法」がみつかってしまうと、
 現代のwebの暗号化通信の根本が揺らいでしまうのかもしれません。
 

.hatena-module:nth-of-type(10) { background: transparent; } .hatena-module:nth-of-type(10) .hatena-module-title{ display: none; } .hatena-module:nth-of-type(10) .hatena-module-body { padding: 0; }