aSSL
ajaxでSSLライクな暗号化通信のライブラリが出ました(aSSL).どうやっているのかが記されていたので勉強のためもあってこちらを翻訳.
間違っていたらごめんなさい.
aSSLの仕組
ステップ#1
ブラウザによって2種類のランダムな鍵が生成されます.1つは,2048ビットのブラウザ鍵が,他方は128ビットの生来サーバーと交換し合う交換鍵です.
ブラウザはブラウザ鍵を交換鍵で暗号化します.この作業をaSSL.endecryptメソッドという方法で行います.このメソッドはRC4アルゴリズムに基づいています.ブラウザは下記の様なパラメタaSSLKeyがメソッドの結果と対応するようにしてクエリ文字列を生成します.
aSSLConnName=0&aSSLKey=79x66x61x21x130x13x175x254x242x
232x7x10x134x69x16x213この結果をajaxを通してサーバーに送ります.
ステップ #2
サーバーはクエリ文字列を受けると,2048ビットのランダムな鍵(サーバー鍵)を生成します.この鍵を使って,すでに暗号化された交換鍵を暗号化し,この二重に暗号化された交換鍵をブラウザに返します.
ステップ#3
ブラウザは二重に暗号化された128ビットの交換鍵を受けると,自身のブラウザ鍵を用いて解読します.その後,サーバー鍵によって一重に暗号化された交換鍵をサーバーに返します.
ステップ #4
サーバーはこの暗号化された128ビットの交換鍵を受け,自身のサーバー鍵を適用し,平文として交換鍵を読めるようになります.平文の交換鍵はセッション変数として保持されます.ajaxアプリケーションへのサーバーへの返答は,鍵の有効期限(秒)を表しています.その情報によってタイマーがセットされ,使用期間が終わったとき,aSSLは再起動され新しいコネクションを再設立するためにステップ#1からの交渉が再度行われます.
注釈
以下のようなクライアントーサーバー間のaSSL.encryptおよびaSSL.decryptメソッド(両者ともに,BlockTEAアルゴリズムに基づいている)がクライアントおよびサーバーサイドで,全ての暗号化通信に対して用いられる.
aSSLは,複数のセキュアなコネクションで,同時に複数のサーバーでの設立が可能である.
aSSL 1.1はTripleDES block cipherと同様のアプローチを用いる256ビットの鍵をサポートしている.
クライアント(ブラウザ)で暗号化して交換鍵をサーバに送る.サーバはさらに暗号化して返す,クライアントは解読して(まだサーバ鍵で暗号化されてる)サーバに戻す,最後にサーバが完全に解読して交換鍵の共有が終了する.こうやることでネットワーク内に平文で交換鍵が通ることはないんですね.で,この後は交換鍵で暗号化しまくりで送受信しまくりなわけですね.有効期限も設けて定期的に交換鍵をリフレッシュすることもしているし.なるほどなぁ・・・