チャットプロトコル (2) 接続手順
一応それらしいものはできてきています。
ただ、作った後で悩み始めたというどうしようもない状況。
悩みどころ1
- 接続開始手順
接続開始は、SYNを受けてハーオープンな状態を保持する仕組みを作ると、syn floodでDoSされそうなんですよね……。アプリ側に任すのもありですが、面倒なのでこっちでやろうと思い、今のところCookieを使ってみてます。
Client | Server -------------------------------- Cookieくれ -> <-ほいCookie (Cookieを送ったことは覚えない) Cookie接続 -> (Cookieチェック) <-おk (接続確立)
Cookieは、
------------------------------------------------------------------- | セキュアな乱数 | クライアントのIPアドレス|ポート番号 | タイマー値 | ------------------------------------------------------------------- 54bytes 4bytes 2bytes 4bytes
のようなデータを、サーバー側でもっているCookie用のAES鍵(128-bit)でCBCモードの暗号をかけて返します(4-block)。接続要求は、このデータをそのまま受け取ったと仮定して復号後にクライアントソースアドレスとタイマー値をチェックすることで、ハーフオープン状態を無くせるのではないかと考えました。
暗号の強度がちょっと疑問なので、ツッコミあればお願いします。
というか、接続時に暗号は負荷が大きいですかね……。
とりあえず確認したいのは、
- 接続相手がソースアドレスを偽装していないか
ということだけなんですけど。
チャットとは、超関係領域にハマリソウデス。