数年前からのGoogleの扇動により各種WebサーバーがSSLやらTSLに一気に対応していきました。
だから何だと言われても困るのですが?
HTTPでの通信が傍受される機会が著しく上昇したのです。
例えば、FreeWifiとかですね?
Wifiの電波は外を飛んでいるわけですから、簡単に傍受ができます。そして、Freeの場所は不特定多数がアクセス出来るようにするため、パスワードが無かったり、公開されていたりして
飛んでる電波からパケットを取り出して、それは暗号化されていなかったり、パスワードが分かっているので簡単に復号化できたり。
もし、そこで、秘匿すべきデータを含む通信をしたら簡単にばれてしまうわけです。
場所にも寄りますが?有名どころのFreeWifiのスポットでは、常に誰かがデータを取得していて、特定のキーワード等で分類した結果を売っている人が居るとまで言われていました。
そして、それは頻度の違いしか無く、実際に行われていたでしょう。
スパイの仕事も楽だったでしょうね!
まぁ、実際の所Googleがどう言う状況を想定して
「Httpsに対応していないところは検索結果に表示しない」とか言いはじめたのかは判りませんが、結果として、通信の秘匿性が高まったので良いとしましょう。
そして本題。
SSLやTSL(以降TSL)ではどうやって暗号化通信をしているのでしょうか?
それはサーバー証明書と言われる物を、信頼された機関から発行して貰い、それをサーバーに設定します。
TSLでの通信要請(正確には証明書要求)がくると、サーバーの証明書をクライアントに送信し、クライアントは、その証明書が正しいのかを判断し、正しければ、そのサーバーの公開鍵を使ってサーバーとの通信を始めることになります。
ここで言う公開鍵とは何でしょう???
RSAは公開鍵暗号方式と日本語では言われ、
特殊な値(桁の大きい素数と言われています)を二つ用意し、片方の素数を計算した結果を秘密鍵とし、もう片方の素数を計算した結果を公開鍵にします。
そして、この両方を用いて、何らかの方法で計算すると、
秘密鍵を使って暗号化した物は、公開鍵でしか復号化出来ず、
逆に
公開鍵を使って暗号化した物は、秘密鍵でしか復号化出来ない。
そういった変わった特性を持ちます。
これがRSAの基本的な仕組みです。
これは高度な数学モデルに基づいて作られたもので、素数の特性(下記)を利用したものです。
素数と言えば 2と3がわかりやすく有名ですね。
この二つを掛けた答え 2×3=6
この6は、元になった素数である2と3以外では割れない。
RSAの具体的な計算式は分かりませんが?
暗号前のデータを100とします。
公開鍵(2とします。)で暗号化(単純に掛けます)したけっか 200になりますね?
これをサーバー側に送り、サーバー側は受信した200を6で割り、3を掛けると100になります。
こうして、暗号化されたデータが復号化出来るわけです。
ただし、この公開鍵暗号には重大な欠点があります。
サーバーから返されるデータが 20だとします。
これを暗号化、3で割り6を掛けると、40になります。
公開鍵は2なので、この40を受信した人は 40/2=20で、だれでも復号化出来てしまうのです。
公開鍵暗号方式において、戻ってきた値というのは、
公開鍵で復号化出来る => 正しいサーバーから送られてきたデータ
それだけでしかないのです。
まぁ、なので、あたしとしてはTLSは送られてくるデータは暗号化されていないとばかり思っていたのです。
なので、あたしが作っていたWebアプリは全て、サーバー側で暗号化してからTSLでクライアントへ送り、クライアントはこれを復号化してデータを読み取っていたのです。
ですが、こんな穴あきのRSAのままインターネットが普及しているはずが無いという考え方もあります。
そこでHTTPSのプロトコルを調べたところ、サーバーの証明書で本物か確認出来たら、暗号キーを作成して、共通鍵暗号方式で通信していました(笑
注意しなければならないのは、RSAでは、サーバー側へ送る時しか通信を秘匿出来ないのです。
なので、この暗号キーはクライアント側で作成して、サーバーに送る必要があります。
HTTPSはまずサーバー証明書でサーバーの確認をすると、サーバーから送られたキーを元にクライアント側で暗号キーを作成し、それをサーバーへ送信します。
するとそれ以降の通信は、その暗号キーで共通鍵暗号方式で通信することで、通信を解読出来ないようにしてます。
いわゆるワンタイムパスワードと同じ様な感じで、常に暗号キーが違うので、暗号文を復号化することがほぼ不可能な方式と言うことになります。
HTTPSが思ったよりも安全で良かったです。
因みに、一般的なワンタイムパスワードは、暗号生成器で、ユーザーのIDと現在の時間などから算出出来る6桁程度の数値であることが多いですね。
|