NSAがhttps通信を盗聴できるという事実のやばさとWebアプリケーションの実装レベルで対策する方法についての考察

NSAが盗聴可能な通信の中にhttpsも含まれるという記事を読んで、なんとか通常のWebアプリケーションとして回避できる実装がないか考察してるうちにいかにhttps通信自体の盗聴が可能ということがヤバイことか気づいたお話
7
じんぷ~ @_j6k1

ただ、鍵交換のところだけで言えば、この方式で鍵ペアを作って通信するようにするネイティブアプリからクッキーなど使わず作った鍵ペアでユーザを識別するIDを送信してセッションを確立することでサーバ側はapacheでもセキュアなアプリケーションは一応実装できそうですね。

2015-01-16 04:41:14
じんぷ~ @_j6k1

特にandroidやiphoneのWebView使ったアプリならブラウザの動作に独自のセッションIDを生成した鍵ペアで暗号化して常に送信させることも容易そうだし

2015-01-16 04:42:19
じんぷ~ @_j6k1

セッションIDもユーザIDもパスワードも筒抜けってとんでもないことだと思うんだけど。

2015-01-16 04:44:22
じんぷ~ @_j6k1

とぎゃったーにまとめた鍵交換のプロセスで通信を暗号化してその鍵ペアでセッションIDも何もかもやり取りするフロントエンドとサーバ再度両方を統合したフレームワーク必要になりそうだなあ。

2015-01-16 04:48:51
じんぷ~ @_j6k1

シングルページアプリケーションとして動かすことでフレームワークが勝手に認証プロセスを常に行ってくれるように。

2015-01-16 04:49:38
じんぷ~ @_j6k1

でないとNSAの盗聴対策まで対策が及ばないと思う

2015-01-16 04:50:12
じんぷ~ @_j6k1

っていうか、もう通信プロトコル自体を新しく作るべきなんでしょうね本当は。

2015-01-16 04:51:31
じんぷ~ @_j6k1

常に2つの鍵ペアが生成されて後に作られた鍵ペアのみが実際の通信に使われるように。

2015-01-16 04:52:18
じんぷ~ @_j6k1

ブラウザアプリ用のフレームワークで対応する場合、メモリの開放周り考えると完全なシングルページアプリケーションはやめたほうがよさそう。ページのコンテンツの中身を常にAjaxで取得するようにしてその通信時に鍵ペアでセッションID暗号化して送信するほうがいいな

2015-01-16 04:54:28
じんぷ~ @_j6k1

で、ページ遷移自体は行うようにする。

2015-01-16 04:54:51
じんぷ~ @_j6k1

いくら鍵をユーザ毎にその都度発行したところで、国家権力の力で全部譲渡させられていたとしたら結局無意味だから、NSAのそういう行為は本当に問題だよね

2015-01-16 04:59:48
じんぷ~ @_j6k1

@jz5 それはないと思う。クライアントにどんな細工をしようがサーバ側の秘密鍵は盗めない。

2015-01-16 05:02:34
じんぷ~ @_j6k1

まあ、複合化済みのデータを特定のIPに向けて勝手に送信させてたらアレだけど。

2015-01-16 05:03:32
じんぷ~ @_j6k1

俺はたぶんsslの鍵そのものを強引に提出させているか、大量の通信をつき合わせて大量のコンピュータで解析することで鍵を計算で導き出せるんじゃないかと思ってる

2015-01-16 05:07:23
じんぷ~ @_j6k1

だから鍵をユーザ毎に発行してるインスタントメッセンジャーの通信は解読が非常に困難になっているんじゃないかなと

2015-01-16 05:08:08
じんぷ~ @_j6k1

とりあえず、NSAによる盗聴対策は最初からそれを想定して防げるようにしっかり作りこまないと無理だから、全く新規に何か作るときに行うようにして今は忘れよう

2015-01-16 05:14:49
じんぷ~ @_j6k1

あ~、っていうか、鍵ペアでセッションID暗号化して独自に送信もダメなのか。暗号化済みのセッションIDを盗聴して直接送りつければ暗号化前のIDなんか知らなくてもセッション乗っ取れるんだ。

2015-01-16 05:17:26
じんぷ~ @_j6k1

ただ、セッション貼る前に鍵ペア発行して以後鍵ペア再発行するときはセッションIDも更新してしまえばセキュアですね。

2015-01-16 05:19:34
じんぷ~ @_j6k1

セッションだけハイジャックできても通信の中身が読めないので。

2015-01-16 05:19:57
じんぷ~ @_j6k1

開発中のSNSの管理サイト作るとき、そんな感じでレイアウト以外のデータを全てAjaxで鍵で暗号化してやり取りするようにしてみようかな。

2015-01-16 05:21:51
じんぷ~ @_j6k1

管理サイトについては直接サーバに鍵をSCPでデプロイできるから少し仕組みは簡単だ

2015-01-16 05:22:31
じんぷ~ @_j6k1

ログインページをローカルネットワークの開発サーバにおいて、開いたときにajaxで開発サーバ上のPHPから取得してその鍵でIDとパスワードを暗号化してログイン、外部ネット上のホームへ移動直後クロスドメインajax通信で再度開発サーバから鍵を取得してlocalstorageへ保存

2015-01-16 05:27:35
じんぷ~ @_j6k1

あとは保存した鍵でセッションID以外の通信を常に暗号化すればいい(セッションIDは暗号化しても暗号化済みのIDを盗まれれば同じことなので普通にクッキーで送る)

2015-01-16 05:28:57
じんぷ~ @_j6k1

あ、この考え方でいくと、とぎゃったーでまとめたやり方でもセッションIDはクッキーで送っていいことになるのか。

2015-01-16 05:30:04