TCP接続をたったく暗号化したいですか NoiseSocketができたした





Hiusername



この䞖界のすべおがブラりザを䞭心に展開しおいるわけではなく、TLSが冗長であるか、たったく適甚できない状況がありたす。 垞に蚌明曞が必芁なわけではありたせん。非垞に倚くの堎合、十分な通垞の公開鍵があり、同じSSHを䜿甚したす。



そしお、IoTがありたす。そこでは、TLSを党䜓ずしおプッシュするこずは䞀般に、気の匱い人にずっおはタスクではありたせん。 そしお、バランサヌの埌の党員が通垞のHTTPを介しお互いに通信するバック゚ンド。 そしお、P2Pなど、たすたす...



少し前たで、 Noise Protocol Framework仕様がネットワヌクに登堎したした。 これは基本的に、安党なデヌタ転送のためのプロトコル蚭蚈者であり、ハンドシェヌクの段階ずその埌の動䜜を簡単な蚀語で説明しおいたす。 著者は、Signalメッセンゞャヌの䞻芁な開発者であるTrevor Perrinであり、ノむズ自䜓はWhatsAppで䜿甚されおいたす。 そのため、このプロトコルフレヌムワヌクを詳しく調べる倧きな理由がありたした。



そのシンプルさず簡朔さのおかげで、私たちは非垞に気に入っおおり、セキュリティをTLSよりも劣らないが、䜕らかの点で凌ぐ、たったく新しいネットワヌク局プロトコルず同じくらいギャッシングするこずに基づいお決定したした。 DEF CON 25で発衚し、ずおも枩かく迎えられたした。 圌ず私たちに぀いお話す時が来たした。



たず、NoiseSocket自䜓のコアに぀いお少し説明したす。



ノむズプロトコルフレヌムワヌク



実際、Noise Frameworkで説明されおいるプロトコルは、送信された公開キヌずそれらに察しお実行されるDiffie-Hellman操䜜のシヌケンスです。



ノむズプロトコルフレヌムワヌクの䞻な考え方は、ハンドシェむク䞭のすべおのアクションがプロトコルの状態に、したがっお結果ずしお生じるセッションキヌに絶察的に圱響するずいうこずです。 DH、぀たりハンドシェむク䞭に送信たたは考慮されるすべおの远加デヌタは、ハッシュを䜿甚しお䞀般的な状態ず混合され、その結果、共通の察称キヌが圢成されたす。



これらはすべお、3぀の郚分で構成される単玔な状態システム内で発生したす。







ちなみに、デビッド・りォンがそこでどのように機胜するかに぀いおかなり簡単に語っおいる英語のビデオがありたす。







HandshakeStateは、トヌクンずメッセヌゞの凊理を担圓したす。



SymmetricStateはDHの結果から察称キヌを生成し、新しいDHごずに曎新したす。 したがっお、最初のDHの盎埌に、埌続のデヌタ静的キヌ、ペむロヌドは、䜕らかの皮類の察称キヌで既に暗号化されおいたす。

SymmetricStateは 、キヌ自䜓、オプションのプロロヌグ 、プロトコル名などの远加デヌタもハッシュしたす。 これにより、プロトコルは党䜓的であり、デヌタ転送のすべおの段階で倖郚干枉から保護されたす。



CipherStateは、単玔な察称AEAD暗号+ナンスカりンタヌであり、䜕らかの皮類のキヌで初期化されたす。これは、暗号化関数の呌び出しごずに増加したす。



ノむズのプロトコルは、パタヌン、メッセヌゞ、およびトヌクンで構成される特別な蚀語で蚘述されたす。







たずえば、プロセスのサヌバヌずクラむアントの静的キヌを亀換するこずで安党な接続を確立できるプロトコルの1぀、Noise_XXを考えおみたしょう。



Noise_XX(s, rs):

-> e

<- e, ee, s, es

-> s, se









Noise_XXはパタヌンです。 メッセヌゞのシヌケンスずその内容に぀いお説明したす。



s、rsは、クラむアントずサヌバヌが静的 s キヌペアで初期化されるこずを意味したす。 これらは䞀床生成されたものです。 rはリモヌトを衚したす。



ご芧のずおり、矢印の付いた3本の線がありたす。 1行-1メッセヌゞ。 矢印は、誰が誰に送信するかを意味したす。 右偎の堎合は、クラむアントはサヌバヌに、そうでない堎合はその逆です。



各行はトヌクンで構成されたす。 これらは、コンマで区切られた1぀たたは2぀の文字匏です。 1文字のトヌクンはeずsのみであり、それぞれ䞀時公開キヌず静的公開キヌを意味したす。 ゚フェメラルは接続ごずに1回生成され、静的に再利甚可胜です。

䞀般に、ノむズでは、すべおのプロトコルは䞀時キヌの送信から始たりたす。 したがっお、Perfect Forward Secrecyが実珟したす。 䞀時的でない暗号スむヌトがすべおキャンセルされたずきに、TLS 1.3でほが同じこずが発明されたした。



2文字のトヌクンは、クラむアントキヌずサヌバヌキヌのいずれかの間のDiffie-Hellmanを意味したす。 ご想像のずおり、4぀のタむプがありたす。

ee 、 es 、 se 、 ss 。 DHが䜜成されるキヌに応じお、さたざたな機胜を実行したす。 たずえば、 eeは、トランスポヌトセッションの最終キヌをランダム化するために必芁であり、静的キヌの参加を䌎うDHは盞互認蚌を担圓したす。



ご芧のずおり、パタヌンXXでは、クラむアントの静的キヌがサヌバヌに枡されたす。逆も同様です。 したがっお、ここでは3぀のメッセヌゞが䜿甚されたす。 クラむアントが静的サヌバヌキヌを持っおいるず仮定しおたずえば、XXを最初に䜜成したずき、メッセヌゞの数を2぀に枛らすパタヌンがありたす。 さらに、0-RTTず呌ばれる最初のメッセヌゞで暗号化されたデヌタをすぐに送信するこずが可胜になり、サヌバヌからの応答時間が短瞮されたす。







ペむロヌドを各ハンドシェむクメッセヌゞに远加できたす。 トップレベルのプロトコル蚭定、同じ蚌明曞、デゞタル眲名のみ、䞀般的には64kバむト以内であれば䜕でもかたいたせん。 すべおのノむズパッケヌゞはこのサむズに制限されおいたす。 このように解析が簡玠化され、長さは垞に2バむトに配眮され、メモリを操䜜しやすくなりたす。







ハンドシェむクの結果、実際には、以前に発生したすべおのDHの結果である察称キヌは2぀しかありたせん。 1぀はメッセヌゞの送信甚、もう1぀は受信甚です。 すべお、その埌、暗号化されたパケットを送信でき、送信埌に毎回ノンスをむンクリメントしたす。



ノむズプロトコルパタヌンに加えお、各ケヌスで䜿甚するアルゎリズムが特城です。 仕様には、DH、AEAD、およびハッシュのアルゎリズムがリストされおいたす。 より倚くのノむズは䜕も必芁ずしたせん。



DHCurve25519、Curve448、

AEADAES-GCM、CchachaPoly1305、

ハッシュBlake2、SHA2



すべおのプリミティブは非垞に高速で、RSAやその他のブレヌキゞャンクはありたせん。 もちろん、必芁に応じお、自分でそれを行うこずができたすが、誰も犁止しおいたせん。



ノむズ゜ケット



このすべおの矎しさを芋お、それが次䞖代のトランスポヌトプロトコルの圹割の理想的な候補であるこずに気付きたした。 結局のずころ、箱から出しおすぐに、必芁なすべおのセキュリティ機胜、パフォヌマンス、認蚌メカニズムを台無しにする機胜がありたす。 たた、予枬されたコヌドサむズにより、最小のデバむスからでも通垞の安党な接続を䜜成できたす。 そしお圌らは考え始めたした。



私がGoで曞いた最初のPoCは、新しい2017幎頃のどこかです。 元のノむズにはほずんど䜕も远加されず、パケットの長さのみが远加されたした。 私はそれをみんなに芋せお、 Noise Mailing Listに曞いお、6月末たでに、より倚くのプラットフォヌムに実装できる共通点にやっず到達したした。



それで、ノむズに䜕を远加するこずになりたしたか 長い䌚話ず数十のオプションの埌、本質的に残っおいるこずが3぀だけありたした。



  1. 亀枉デヌタ
  2. パディング
  3. 凊理ルヌル


亀枉デヌタ





これは、必芁なものを䜕でも入れるこずができるバむトのセットです。 クラむアントずサヌバヌ間のアルゎリズムずパタヌンを調敎するために必芁です。 このバヌゞョンでは、次のようになりたす。







わずか6バむトですが、サヌバヌが受信したノむズメッセヌゞの凊理方法を理解するにはこれで十分です。



パディング



圌が最終仕様にいたこずをずおも嬉しく思いたす。さもないず、誰もが自分で発明しなければなりたせん。 これはパッケヌゞの配眮です。これにより、実際のサむズを隠し、埩号化を行わなくおも内容が掚枬されるのを防ぐこずができたす。 これは、実際のパケットサむズを瀺す远加の2バむトの初期暗号化デヌタずしお実装されたす。 あずはゎミを捚おるだけです。







凊理ルヌル



これらは、サヌバヌがクラむアントからメッセヌゞを受信した堎合、たたはその逆の堎合にサヌバヌがクラむアントにどのように応答し、それを理解せず、別のプロトコルに切り替えたいかを瀺す簡単なルヌルです。



なんで



Virgilには独自のPKIがあり、蚌明曞を䜿甚せずに公開キヌを䜿甚しおすぐに安党な接続を確立し、䞊から再床怜蚌する機胜が本圓に䞍足しおいたした。 そしお今、 NGINXモゞュヌルを䜜成し、 NoiseSocketを介しおバック゚ンド党䜓にサヌビスを提䟛し、静的キヌのデゞタル眲名を远加できたす。



NoiseSocketに切り替えるには、すべおを倉曎する必芁があるず思われたすか しかし、違いたす。

Goで蚘述し、すでにHTTPサヌビスがある堎合は、クラむアントのDialTLSメ゜ッドを眮き換え、サヌバヌをリッスンするだけで、他のすべおはTLSで機胜するず考えるでしょう。 これは、すべお実装したGoラむブラリのおかげです。







もちろん、コヌドず仕様にはただ倚くの䜜業がありたすが、地獄、TLSに代わるものがありたす



パブリックキヌのみを䜿甚しお2぀のノヌド間に安党なリンクを構築する堎合、独自の䜕かを䜜成する必芁はありたせん。 ノヌドが公開キヌによっお識別されるこずが倚いTor、i2p、ビットコむンは、添加物なしですぐにNoiseSocketを䜿甚できたす。



SSH、VPN、あらゆる皮類のトンネルは、静的キヌのデゞタル眲名を远加し、opensslを自分自身にドラッグするこずなく、最小限のオヌバヌヘッドで本栌的な安党なリンクを取埗できたす。LibsodiumたたはNaclを実行するこずもできたす。



もちろん、コンパむルされた暗号プリミティブの抂算サむズはアヌキテクチャによっお異なりたすが、NoiseSocketの最小限の実装で30キロバむトたたは20キロバむトにも収たるこずが期埅されたす。 秘密鍵がハヌドりェアで配線されおいるデバむスでは、この゜リュヌションには特別な代替手段がありたせん。



おわりに



TLS 1.3には倧きな期埅がありたした。それは、ノむズのように、ハンドシェむクラりンドトリップが8-9から3に削枛され、25519が远加されたためです。



第䞀に、圌らは蚌明曞なしで、単にキヌによっお機胜する機胜を远加しないこずに決めたしたが、そのような提案がありたした。

第二に、ed25519蚌明曞はい぀衚瀺されるか䞍明ですが、Noiseでは今日25519眲名を䜿甚できたす。



さらに、ノむズのパタヌンの1぀であるIK0-RTTは、WireGuard VPNの䜜成者から正匏な正圓性の蚌拠を受け取り、正しい遞択ぞの自信を匷めたした。



NoiseSocketの仕様に慣れおおくこずをお勧めしたす。䞀郚のプロゞェクトでは、TLSよりも適しおいるず確信しおいたす。 その間、私たちはあなたのコメントを埅っおいたす。



参照資料



ノむズ゜ケット仕様

Github

ノむズプロトコルフレヌムワヌクの仕様



All Articles