2014/09/11

UDP通信って暗号化できるの?

── FTPに対してSFTPとかSCPがあんじゃん。UDPってそういう暗号化通信するプロトコルってあんの?
などと言ってるのを聞いてしまいました。
この質問もレイヤーを無視したいい加減な質問だが、それはそれとして
もしこう聞かれちゃったらやっぱり答えに詰まるでしょう。

FTPとかHTTPとかはアプリケーション層のプロトコル。
暗号化プロトコルのTLS(SSLのこと)もアプリケーション層だが、順序としてはFTPとかHTTPの下位プロトコルになる。
つまり IP→TCP→SSL→FTP or HTTP という積み上がり。

アプリケーション層は送られたデータの内容をどう扱うかの取り決め。
なのでブラウザで表示するとかもあるが、暗号化するとか、復号化するとかの取り決めも当然ある。
そんなわけでTCP/IPの通信(HTTP,FTPなど)の多くにSSL版(HTTPS,SFTPなど)がある。
FTPに対してSFTPとかがあんじゃん、というのはここから来ている。

対してUDPはトランスポート層のプロトコル。
トランスポート層のTCP、UDPはどんな感じで送るのか、の取り決めなので運んでいるデータに関しては無関心だ。
暗号化はその上位層でやってくれ、ということ。
「(上位層の)SSLは通信内容を暗号化するプロトコルなんだからUDP通信もそれ使ってTCPと同じように暗号化すれば良いじゃない」、と思うがSSLはTCPの上位プロトコルであってUDPの上位には無い。
サボってるんではなく、SSLは最初に鍵交換が必要だったり、整列された完全なデータでないと解読できないなどの理由から、UDP通信をSSLで暗号化することは出来ない。
例えば同じデータをTCPとUDPで送ると、TCPではデータが完全に届くがUDPでは途中が抜けたり順番が入れ替わったりする。UDPはIP電話とかビデオチャットとか、正確に全部届くことよりリアルタイム性を重視する通信に使うのでそれで良いんだが、もしUDPで暗号文を送信して、受信側で文字が入れ替わってたりするともう復号できなくなるのは当然だ。

こういうUDPの使われ方だけを見ると「UDPってそういう暗号化通信するプロトコルってあるの?」というのは変な質問だが、実はUDPを使ってファイルの転送など完全性が必要な通信を行うソリューションがいくつかあるからだ。
UDPで通信し、データの順や抜けを独自にコントロールすることでTCPより速くなる場合がある。この場合暗号化も独自に行うことになるので「そういう暗号化通信」が出来るかどうかはソリューションによるとしか言えない。

またそれとは別に、DTLSというUDPを暗号化するプロトコルもちゃんとある。
IP電話等の傍受防止のためにDTLSは使われる。どういう風に暗号化、復号化してるのかはよく分かんないけど(ネスペ対策のためだけに勉強するにはマニアック過ぎるし)。

一方ネットワーク層のIPにはIPsecというIPの補助的なプロトコルがあって、上位層を全部、あるいはトンネルモードならIPも含めて全部暗号化することが出来る(IPsecはIPv4では補助的なプロトコルだがIPv6では必須になった)。
IPは「どこからどこまで送る」、の取り決めだが、要はIPだけでデータを届けることまでは出来るのでこの上位層(TCPだろうがUDPだろうが)をまるごと暗号化しても届けることが出来るということ。
これは低層での処理なのでイメージがかなり異なる。
送信アプリケーションは暗号化など意識しないで送信して、IPsec対応装置(ソフトウェアでも良いが)が勝手に暗号化し、受信時もIPsec装置が勝手に解読して受信アプリケーションは暗号化されてないパケットを受け取る、という感じ。
つまりVPNみたいな利用方法だ。
「UDP通信を暗号化する」というお手軽なイメージとは異なるが一応UDP通信が暗号化されていると言える。

で質問にだけ答えると
── HTTPSとかSFTPとかってTLS(SSL)を使ってるんす。
   でもTLSってTCPの通信じゃないと使えないんすよ。
   UDP版のTLSっていう位置付けでDTLSってのが一応あるっすよ。
   UDP通信で暗号化が必要なアプリならきっとDTLSで通信するモードがあるはずっす。
   あとIPsecを使ったVPNみたいな通信ならTCPもUDPも自動的に暗号化されるんすが
   まぁ対応機器が必要だったり送受信の両者で設定が必要だったりで大袈裟っすね。
なんでこういう口調なんだろうか。

0 件のコメント:

コメントを投稿