ラベル aSSL の投稿を表示しています。 すべての投稿を表示
ラベル aSSL の投稿を表示しています。 すべての投稿を表示

2010年9月21日火曜日

httpsを使わずに暗号化通信 with aSSL 〜泥沼〜

先のエントリでaSSLがどうのこうの言ってましたが、ようやく実際に試すことにしました。

しかし本家のPHP版サンプルが動かない・・・
動かない間接的な原因は、ajaxのresponseTextが空になってるからなんですが、直接的な原因が掴めません。

でも本家のサンプルはちょっとでかすぎる気がします。コード読むのが辛い。

僕が実装したいのはもっと小ぢんまりしたものなので、言語はRuby+Javascriptですが、こちらのページを大いに参考にさせていただいて何とか頑張ろうかと思います。

要するに、
  1. PHP側=サーバ側で公開鍵と秘密鍵をペアで生成
  2. Javascript側=クライアント側で公開鍵を受け取る(サーバ側が公開鍵を一意に定めるNとEを渡し、それを使って公開鍵を生成)
  3. Javascript側で公開鍵を用いて、POSTするデータを暗号化
  4. サーバ側が、POSTメソッドで受け取ったデータを秘密鍵で復号化
ってのをしてるだけなはず。
で、2,3の部分でaSSLさんが大活躍すると思われます。

ちょっと試行錯誤して、できるだけ小さいサンプル作って報告しようかと思います。

まずは牛丼食べてこよ。

2010年9月16日木曜日

httpsを使わずに暗号化通信 with aSSL

「個人情報やり取りするのに平文通信は危ないよね。」という、並のセキュリティ意識は付いてきた夏の日。
でも、httpsプロトコル使うと、SSLサーバ証明書の確認とかでユーザ(クライアント)を煩わせちゃいますよね。特に個人で運営しているWebサーバの場合。

でも、よく考えると暗号化通信にSSLサーバ証明書は必要ないはず。
「証明書がなければ暗号化通信してもそのサーバは信用できない」などとよく聞きますが、これはあくまで一部のユーザの言い分です。
Webサーバを構築する側からしたら、「自分のサーバへ通信しているユーザの個人情報は絶対に盗聴されたくない」というような要望もあっておかしくないはず。

そんな風に考えたので、Web素人の僕はTwitterでフォロワーのみなさまにお知恵を拝借。
すると30分ほどで有力なお答えが!

aSSLというものが上記の要望をそのものずばり叶えてくれそうです。

こいつの仕組みは、
1. The browser calls the server to start the process.

2. The server returns its RSA modulus and the public exponent.

3. The browser generates a random exchange 128-bit key, encrypts it using the server public key and passes the encrypted exchange key to the server.

4. The server receives this encrypted 128-bit exchange key, decrypts it with its private key and, if the result is ok, returns the session duration time.

5. The browser receives the session duration time and sets a timeout to maintain alive the connection.
だそうです。

かるーく和訳すると、
  1. サーバがクライアントに公開鍵(A)を渡す
  2. クライアントが個人情報などを共有鍵(B)で暗号化し、共有鍵(B)と共にサーバに送信。この際共有鍵(B)は公開鍵(A)で暗号化
  3. サーバは受け取った共有鍵(B)を、公開鍵(A)のペアの秘密鍵(A')で復号化。復号化された共有鍵で個人情報を復号化する
って感じですかね。
まだ使ってないのでなんとも言えませんが。

今度作る予定のWebアプリでは、勉強がてらセキュリティにこだわってみたいと思います。
aSSLは絶対取り入れたいですね。

関係ないけど、AES 128-bit にはインターンで作ったネタアプリでお世話になりましたw