2010年9月30日木曜日

ネットワークのお勉強なう

そろそろ夏休みも終わり大学が再開するので、勉強モードに入りました。
勉強といっても自分の好きな分野しかやりませんが。

それに伴い、Webアプリ開発は一旦おやすみです。
つーかログインシステム周りがうまく書けた時点で飽きたw

Rubyコミッタとして名高い笹田先生の対談記事なんか読んで、applicationをやるのも楽しいけど、やっぱりもうちょっと基盤的な勉強も必要だなと思ったり。
それが勉強モードに入った大きな要因ですかね。

とりあえず今は名著らしいTCP/IPによるネットワーク構築を呼んでいます。

サーバ構築なんかするようになって自分やるじゃんとか思ったり思わなかったりでしたが、やっぱりこういうの読むと知識が安定するというか、安心感のようなものを覚えます。

しばらくはお勉強モードが続いたらいいな。

2010年9月23日木曜日

httpsを使わずに暗号化通信 with aSSL 〜結局aSSL使わず解決w〜

前回の記事を書いた時点できっつい予感はしてたんですが、やはりaSSLのPHP版は動かすに至りませんでした。

原因は全然掴みきれてませんが、PHPの環境構築な可能性が一番高い気がしてます。

しかし、所望の暗号化通信自体には成功しました。
今回はjCryptionというライブラリを使用しました。

こいつもaSSLと同じようなものなんですが、jQueryに依存している点、Javascript+PHPのサンプルが文句なしに動く点が違いましたw

今回はこいつの解説とかを特に行ったりするわけではないですが、 ライブラリに付属してくるサンプルが小さくて解りやすくてすぐ動くので、導入はそこまで大変ではないはずです。

おかげさまで、ユーザにメールアドレスやらパスワードやらを送信してもらう際に、暗号化してデータをPOSTすることが可能になりました。


こんな感じで普通にボタンをクリックすると、wiresharkで見たときに、、


こんな感じで、
$_POST['email] === 'someone@somewhere.com'
$_POST['password'] === 'secret'
であることがモロばれです。

そこでjCryptionを使ってやると・・・



メールアドレスもパスワードも、全部 $_POST['jCryption'] という変数に暗号化して収められていることが分かります。

あとはこいつをPHP側で(サンプル通りに)復号化してやれば、目的達成というわけです。


しかしjQryptionにたどり着くまでに色々なライブラリを試しては挫折しを繰り返し、今日はほぼ一日暗号化に費やしてしまいました。非リア乙。

あとは今後このライブラリ周りで改善していきたいことを書いていって本日の記事を締めくくりたいと思います。


  1. こちらで指摘されているとおり、セッションで鍵情報をやり取りするのはよろしくない
  2. 暗号化はRSAの2048bitだが、さすがに処理が重い。ライブラリのソースいじってビット数をもう少し落としたい

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

2010年9月14日火曜日

セキュリティ&プログラミングキャンプ2010 Linux組の様子が記事になりました

そろそろうだるような暑さもおさまってきそうですね。

そんな折り、猛暑真っ最中に開催されたセキュリティ&プログラミングキャンプ2010のLinux組の様子が@ITで記事になりました。

Linux組に参加したのはもう1ヶ月前のことになりますが、未だに他の参加者の人達とも仲良くさせてもらってたりします。
この間セキュリティ組の友人宅に軽い気持ちでお邪魔したら、インターネットの深遠な世界を知ることになりました。
攻撃者目線で僕のサーバをチェックしてくれたりね。あくまで目線です。法的には全く問題ありません。

でもおかげさまで、今まで興味のなかった(Webの)セキュリティにかなり興味が持てるようになりました。

現在Webアプリをこっそり作ってたりするので、セキュリティもしっかり考慮してつくろうと思います。

そんなときに役立つサイトを見つけました。

IPA セキュア・プログラミング講座

さすがIPAと言いましょうか、眼から鱗です。

考え得る攻撃の仕組み、それに対する対処法がしっかり載ってます。
もちろん扱っている攻撃は有名なものが多いですが、ここまでしっかりまとめていてくれると初学者にとっては非常にありがたいです。

また夏休みの楽しみが増えましたね。やっほー

2010年9月12日日曜日

prototype.js が全然読みやすくない件

ある程度Javascriptのお勉強も終わったところで、prototype.js のコードでも読んでみようかなと思ったんですよ。
prototype.js のコードは読みやすいって『Head First JavaScript』か『JavaScript:The Good Parts』かに書いてあったし。

めっちゃ読みづらくてワロタ

こことか見る限り、以前のバージョンのは読みやすかったみたいだけど、1.6.1では「洗練」されちゃったみたいです。

古いの入手して読みます。

Javascript 難しいお・・・

2010年9月2日木曜日

技術者として成長するには

9月に入って小中高生は学校が始まり、社会人の方は相変わらずお仕事に励まれていることと思います。
そんな中、大学生は10月まで惚けていられる特権階級。

とはいえ、本気で遊び呆けるほど遊びに飢えてもいないので、『JavaScript: The Good Parts —「良いパーツ」によるベストプラクティス』を読んでJavascriptのお勉強を始めました。

目的は2つあります。
1つは、9月はチャットでも作ろうとしてるのでそれに使いたい。
もう1つは、言語として自分の知らない概念を含んでいるから。

1つ目は深める余地もありませんね。ちなみに、ただのチャットと見せかけで裏では凄いことやってる的なチャットにしたいですね。どう見てもオナ(ry

2つ目が今回の記事のテーマです。
僕はプログラムの世界にHSPから入り、ほとんどCと共に過ごし、C++のCにはない概念で感動し、それで言語の知識はほぼ停滞してます。
一応色々な言語は触ってきたのですが、どの言語を使っても使える機能は自分の知っている概念を実装した部分のみ。
だからリテラルだとか無名関数だとか、そういう全然僕自身が中身を把握していない概念を実装した言語をちゃんと学んで、知識を増やそうと考えているのです。

「プログラマのくせに何が知識だ。いいからコード書けよ。」
そう思っていた時期が僕にもありました。マジで。
ですが、最近薄々感づいてきました。ちゃんと色んな概念を座学ベースで学んでいくと、自分の書けるコードの幅が広がる。

例えば8月に参加したセキュリティ&プログラミングキャンプではLinuxカーネルをいじったのですが、これができたのは事前課題でコンピュータアーキテクチャ(Linux固有の部分も含む)を学んだからです。これがなければ、いくらC言語には慣れっこだといえども、なぜカーネル空間でmalloc()を使わないのかとかで悩み、とても開発どころではなかったと思います。

もうひとつ例を出すと、インターンでメール受送信関係のプログラムをいじっていたのですが、最初のうちはサンプルコードのどこをいじればいいのか中々分かりませんでした。ですが、IMAPやSMTPのプロトコル通信について調べて時間を費やした後は、すらすら変更箇所を見つけることができました。

やはり知識の獲得は非常に重要だと思います。当然プログラミングに関しては、コードを書く作業も成長のために必須ですが、知識の獲得は同様かそれ以上に重視したいです。

知識・概念を吸収すること、(今回は触れてませんが)コードを読むこと、コードを書くこと、この3つが一体となって初めて技術者としての成長につながるのだと考えてます。

がんばろ。

2010年9月1日水曜日

KLabインターンを終えて (感想編)

こんばんは。
8/18 - 8/31 の2週間、KLab様にインターンでお邪魔しておりました。
インターンを終えた感想なんかを今のうちに書いちゃいます。

KLabに決めた理由
他にもインターン先の候補は自分の中でいくつかあって、実際に面接を受けたりもしてました。
他の候補もプログラミング系で面白そうだったし、何より結構ゼニが入るところが多くて魅力的でした。

でも、KLabさんに面接に伺ったとき、担当の方が物凄く熱くプログラミングについて語ってくれたんです。
話自体にもすごく感動しましたし、何よりこんな方々がいらっしゃるところで自分も鍛えられたいと直感的に感じたので、二つ返事でやらせていただくことにしました。

ぶっちゃけ当初は第1志望ではなかったのですが、面接で一気にひっくり返されちゃいました。

何をしたか
cheat_gmailっていうふざけてんのかって感じのWebアプリを作ってました。
確かに見た目とか機能とかはしょっぱいんですけど、結構技術的には面白いものを使ってると思いますよ。

特に Gmail の OAuth+SMTP 認証を実装した部分は、ネットで探した限りはかなり先駆的だった気がします。(別に難しいわけじゃなくて、あまりやろうとした人がいなかっただけでしょうが)
おかげさまでKLabさんのブログにも記事を書かせていただくことができました

インターンの様子
インターン1人につきメンターの方が1人つき、何を作るかから全て自分たちで決めて進めていく形でした。
はじめは「Androidで動くsshクライアントを作りたいです!」って言ったんですが、メンターの方に「もうあるでしょ。つまらない。却下。」とバッサリ。社会の恐ろしさを垣間見ました。

で、色々相談した結果、cheat_gmailを作ることに。今思うと、かなり血迷ってたと思います。

そこで開発が始まったわけですが、普段一人でやる時と違って、それなりに設計・進行予定作成をしました。これが非常に後々の開発に生かされ、計画性をもって作業を進めることができました。勉強になります。

それでも帰りの電車とか家で色々しているときに、「あ、あそこはこうしないとだめじゃん」とか「あれもっとこうすれば面白くなるな」とか、新しいアイディアが結構思い浮かんできました。インターンに熱中出来ていたのだと思います。

全く興味のなかった形態素解析や暗号化、OAuthなんかもどんどん吸収して実装していきました。こんな短期間にコーディングできるレベルの知識が身についたのは初めてで、自分でも驚いています。

あと、俺はネットワークめちゃ弱いんで、すぐに「〇〇さん、ネット繋がりません;;」って社員さんに泣きつくんですが、その社員さんがすぐに原因を特定して速攻つなげるようにしてくれるのを見て感動しました。負けてられないと、インターン期間中に自分でサーバも立てちゃったわけですね。

開発以外でも、ランチミーティングが非常に楽しかったです。メンターの方や他の社員の方々、自分以外のインターン生でお昼を食べに行くんですが、時には技術の話、時には大学生でもしないぞってレベルの下らない話をして盛り上がりました。ぶっちゃけ技術の話はついていけない部分もあってチクショーって感じだったんですが、逆にこれから社員の方々に負けないくらい貪欲に知識を身につけようって気にさせられました。

発表会
非常に楽しめました。元々プレゼンは好きな方だっていうのもありますが、社員の方々が対等な目線(思い上がりかもしれませんがw)で質問を投げかけてくださったのが嬉しかったです。

それにちゃんとウケもとれました^^ 接待かもしれませんが^^

プレゼンで使った資料もついでにアップしておきますので、もしも暇で暇でしょうがない方がいらっしゃいましたらご覧ください。

終わりに
技術的にも環境的にも、非常に充実感の味わえるインターンでした。
やはり面接での俺の直感は当たっていたということでしょうか。でも金欠気味なのでお金入るのにすればよかったなんて思ってませんよ、絶対に。

唯一の心残りは飲み会に参加する機会がなかったことです。でもKLabさんは外部を招いた勉強会を開催することもあるようなので、機会があったら参加して、ついでに懇親会にでも潜り込みたいと思います。あくまでついでです。