スキップしてメインコンテンツへ

TLS 1.3で短期鍵を使用するための基本事項を理解する

投稿: 2021年10月15日お知らせ

By Bob Reselman

インターネットが存在するかぎり、セキュリティ上の脅威はあります。幸いなことに、善良な人々は、増え続ける危険に対処する方法を考え出すことができました。しかし、これにはパフォーマンスの代償が伴います。 Transport Layer Security (TLS) 1.3が導入されるまでは、ブラウザーとWebサイト間で「Hello World」のような単純なことを行うための安全な接続を確立するには、要求と応答の往復が多く必要でした。

Netscapeが1995年にSecure Sockets Layer (SSL) をリリースして以来、セキュリティ プロトコルは大きく進化しました。残念ながら、SSLには重大なセキュリティの脆弱性があり、2014年に米国政府はHIPAAデータや政府の機密情報を交換するWebサイトでの使用を制限しました。代わりに 政府が義務付けた のが、次世代のセキュリティ プロトコルであるTransport Layer Security (TLS) の使用です。

TLSはSSLのセキュリティの脆弱性に対処しましたが、1.3より前のTLSバージョンでは、拡張ハンドシェイクによってパフォーマンスの問題が発生していました。 TLS 1.2では、接続ハンドシェイクでは、サーバーに対してクライアントを認証するために、少なくとも2つの要求/応答交換が必要でした。

今日、TLS 1.3は、キー作成ハンドシェイクを単一の要求と応答のラウンドトリップに減らしました。この1回のラウンドトリップにより、クライアントとサーバーの両方が同じ暗号化キーを共有できるようになります。ただし、その暗号化キーがインターネット上を移動することはありません。むしろ、キーは、Diffie-Hellmanキー交換と呼ばれる手法を使用して、クライアントとサーバーで同時に独立して作成されます。キーは「ジャストインタイム」で作成されます。プロセスを説明するために使用される用語は、「エフェメラルキー交換」と呼ばれます。

この記事の目的は、TLS1.3での一時的な鍵交換の操作の詳細を共有することです。 Diffie-Hellmanのメカニズムについて厳密に詳しく説明します。関係する数式がいくつかありますが、これについては説明します。また、より明確にするために、Diffie-Hellman式に実際の数値を挿入するボーナス付録を追加しました。この付録では、実際の計算とその結果を確認できます。

飛び込む前に、Diffie-Hellman鍵交換にはいくつかのセキュリティの脆弱性があることに注意してください。これらの脆弱性については、記事の最後で説明します。それでも、その欠点にもかかわらず、Diffie-Hellmanは注目に値する方法でデータ暗号化を実装しています。公開/秘密鍵暗号化に固有のクライアントとサーバー間の公開鍵交換とは異なり、Diffie-Hellmanでは、暗号化に使用される鍵の交換がインターネット上を移動することはありません。テクニックの詳細は、次のセクションで明らかにされます。

TLS1.3ハンドシェイクとキー作成を理解する

上記のように、TLS 1.3でデータを暗号化する方法の1つは、クライアントとサーバーの両方が同じ秘密鍵を使用してデータを暗号化できるようにすることです。ただし、その秘密鍵がインターネットを介して交換されることはありません。それが機能する方法は、クライアントとサーバーの両方が独自の秘密鍵値を作成することです。クライアントには一意の秘密鍵の値があります。サーバーには一意の秘密鍵値があります。クライアントとサーバーは、一時的な対称鍵を作成するために、両方に知られている公開鍵と組み合わせて、それぞれの秘密鍵の値を使用します。

この公開鍵は非常に大きなもので構成されています 素数, NS、 および基本値、 NS、 それは原始根です。の概念 原始根 の分野から来ています モジュロ算術。原始根は、ある数値を別の数値で除算するときに剰余に関連するという点で特別な整数です。 (原始根は特に複雑な概念ではありませんが、理解するのに少し時間がかかります—残念ながら、それはこの記事の範囲を超えています。)大きな素数と原始根を一緒に使用することについて理解する重要なこと公開鍵は、Diffie-Hellman鍵交換手法に適した数学的関係を作成することです。

エフェメラルキー暗号化の詳細に進む前に、少し一時停止して簡単なレビューを行いましょう。

現在、一時的な対称鍵を使用して安全なデータ交換を行うときは、クライアントとサーバーの両方が個別に特別な秘密鍵値を作成します。この秘密鍵の値は、各当事者に固有の乱数です。また、クライアントとサーバーの両方が、非常に大きな素数と原始根である数で構成される公開鍵を共有します。公開鍵がインターネット上で公開されていることは、特に厄介なことではありません。奇妙なことに、その値は、一方ではクライアントの明確なプライバシーと、他方ではサーバーの明確なプライバシーの範囲内でのみ役立つからです。

それでは、クライアント側に移動して、秘密鍵の作成について調べてみましょう。

クライアント側では、クライアントは、公開鍵で定義された素数と原始根を秘密の乱数とともに適用して、特別な数式を使用して秘密鍵を作成します。以下のリスト1は、変数で表される秘密鍵値を作成するために使用される式を示しています。 .

A = ga mod p

どこ

  • 一時的なキー値です
  • NS 陰部の鍵を定義した原始根の値です
  • a クライアント側で生成された秘密の大きな素数です
  • モッド を示します モジュロ演算子. モッド たとえば、ある数値を別の数値で割ったときに余りを返します。 5 mod 2 = 1
  • NS 陰部の鍵を定義する素数です

リスト1:クライアントがサーバーに送信する一時キー値を作成するために使用する式

次に、クライアントはその番号を送信します サーバーに。

サーバー側では、サーバーはクライアントが実行したように式を実行します。この場合、秘密鍵を作成します。 NS。ただし、サーバーはそのプライベート乱数を使用します NS、以下のリスト2に示すように。

B = gNS mod p

どこ

  • NS 一時的なキー値です
  • NS 陰部の鍵を定義した原始根の値です
  • NS サーバー側で生成された秘密の大きな素数です
  • モッド を示します モジュロ演算子. モッド たとえば、ある数値を別の数値で割ったときに余りを返します。 5 mod 2 = 1
  • NS 陰部の鍵を定義する素数です

リスト2:サーバーがクライアントに送信する一時キー値を作成するために使用する式

サーバーは番号を送信します、 NS クライアントに。

現在のところ、サーバーにはクライアントの一時的な価値があります 、およびクライアントにはサーバーの一時的な値があります NS。以下の図1は、秘密鍵の生成と交換の背後にあるダイナミクスを示しています。 (この図は、対称秘密鍵がどのように生成されるかも示しています。しかし、私たちの先を行き過ぎないようにしましょう。)

図1:Diffie-Hellmanデータ暗号化では、クライアントとサーバーの両方が、交換されることのない秘密鍵を使用します。

秘密鍵交換が行われた後、クライアントとサーバーの両方が共有秘密鍵を生成します。この秘密鍵は、両方の当事者がデータの暗号化と復号化に使用します。

共有秘密鍵の生成は、クライアントとサーバーの両方で同様に使用される別の式を使用すると簡単になります。以下のリスト3は、クライアントが秘密鍵を作成するために使用する式を示しています。

S = Ba mod p

どこ

  • NS 秘密鍵です
  • NS サーバーから送信される一時キーです
  • a クライアントによって生成されたプライベート乱数です
  • モッド  モジュロ演算子です
  • NS 公開鍵で定義されている素数です

リスト3:サーバーと共有される秘密鍵を生成するためにクライアントが使用する式

以下のリスト4は、サーバーが共有秘密鍵を作成するために使用する式を示しています。

S = ANS mod p

どこ

  • NS 秘密鍵です
  • クライアントから送信される一時キーです
  • NS サーバーによって生成されたプライベート乱数です
  • モッド  モジュロ演算子です
  • NS 公開鍵で定義されている素数です

リスト4:サーバーと共有される秘密鍵を生成するためにクライアントが使用する式

クライアントが上記のリスト3に示されている式を実行し、サーバーが上記のリスト4に示されている式を実行した結果、どちらも同じ秘密鍵になります。したがって、クライアントとサーバーの両方が、対称鍵を使用して暗号化されたデータを交換できるようになりました。

(Diffie-Hellmanとエフェメラルキーの仕組みをさらに詳しく知りたい場合は、この記事の最後にある付録を参照してください。実数を使用して、Diffie-Hellmanの下で対称秘密キーを作成する方法を示します。 )

一時的な対称鍵暗号化は、ある意味でほとんど魔法のようなものです。パブリックまたはプライベートを問わず、同一のキーがインターネット上を移動することはありません。

ハッカーが秘密鍵を作成するには、クライアントによって生成された秘密の乱数とサーバーによって生成された秘密の乱数を取得する必要があります。これは、データ交換時に実際にクライアントマシンとサーバーマシンをハッキングすることを意味します。または、どういうわけか、ハッカーは試行錯誤によって、クライアントとサーバーで秘密鍵の値として使用される非常に大きな乱数を把握する必要があります。

完璧な暗号化技術はありません

もちろん、サイバーセキュリティの現実の世界で学んだように、ハッカーに十分な時間とお金があれば、本当に不可能なことは何もありません。主にそのため 大きな素数をランダムに使用することへの依存、Diffie-Hellmanは、暗号を解読するための時間、専門知識、およびリソースを持っている悪意のある攻撃者によって乗っ取られる可能性のある手法の1つです。

Diffie-Hellmanのハッキングについて理解しておくべき重要なことは、この種の悪者は、サイバー戦争が行われる国レベルで働いているということです。 Diffie-Hellmanを破るには、産業用の強力なリソースが必要です。それは通常、退屈なティーンエイジャーが放課後のいたずらとしてできることではありません。

それでも、暗号化技術がどれほど完璧であると考えても、歴史は常に新しい脅威が手元にあることを示しています。 Diffie-Hellmanの代替として広く使用されているRSA暗号化方式でさえ、脆弱性があります。この記事の執筆時点で、業界の多くは、Diffie-Hellmanの使用をに切り替えることを提案しています。 (楕円曲線)Diffie-Hellman または 完全にハッシュされたMQV。しかし、これらの代替手段もハッキング防止ではありません。不快に思われるかもしれませんが、完璧をどれだけ望んでも、「本当に良い」だけが得られることがあります。

すべてを一緒に入れて

この記事では、TLS1.3が1つの要求/応答ペアのみを使用してエフェメラル対称鍵暗号化を実装する方法についてかなり詳細に説明しました。暗号化技術は重要ですが、データ交換のセキュリティは全体像の一部にすぎないことに注意してください。 TLSは多くの暗号化プロトコルをサポートしています。次に、TLS証明書の問題と、さまざまなブラウザおよびインターネットサーバーによるサポートがあります。

TLS1.3は非常に大きなトピックです。ただし、ここで説明するシングルラウンドトリップハンドシェイクとエフェメラルセッションキーの利点が、TLS1.3プロトコルの適切なサイズの部分に光を当てるのに役立つことを願っています。

付録:実数を使用してエフェメラルキーを生成する例

以下は、上記の図3に示すように、クライアントとサーバー間で共有される対称鍵を生成するデモです。この例では、可変プレースホルダーの代わりに実数を使用しています。

公開鍵の値 クライアント側の秘密の乱数 サーバー側の秘密の乱数
素数、 NS = 17

ベース(原始根) NS = 3

クライアントの乱数、 a = 11 サーバーの乱数、 NS =  15

サーバーに送信されるキーのクライアント側生成

A = ga mod p

どこ:

  • a = 11
  • g = 3
  • p = 17

計算:

311 mod 17 = 177147 mod 17

177147 mod 17 = 7

クライアントに送信されるキーのサーバー側生成

B = gNS mod p

どこ:

  • b = 15
  • g = 3
  • p = 17

計算:

315 mod 17 = 14348907 mod 17

14348907 mod 17 = 6

クライアントは共有秘密鍵を生成します

S = Ba mod p

どこ:

  • NS クライアント側で生成される共有秘密鍵です
  • B = 6
  • a = 11
  • p = 17

計算:

611 mod 17 = 362797056 mod 17

362797056 mod 17 = 5

サーバーは共有秘密鍵を生成します

S = ANS mod p

どこ:

  • Sは、サーバー側で生成される共有秘密鍵です。
  • A = 7
  • b = 15
  • p = 17

計算:

715 mod 17 = 4747561509943 mod 17 

4747561509943 mod 17 = 5

クライアントとサーバーによって生成されたキーの値は、互いに独立していることに注意してください。 5。したがって、5は、インターネット上のクライアントとサーバー間の交換でデータを暗号化および復号化するために使用される共有秘密鍵の値です。

安全な開発の実践についてさらに学ぶために、Linux Foundation Training&Certificationは、Open Source Security Foundation(OpenSSF)と提携して、安全なソフトウェア開発をカバーする3つのオンライントレーニングコースの無料シリーズを提供しています。 要件、設計、および再利用(LFD104x), 実装(LFD105x)および 検証およびより専門的なトピック(LFD106x).

この記事はもともとで公開されました TheNewStack.

Linux Foundationのトレーニングと認定に関心をお寄せいただきありがとうございます。私たちは、中国のトレーニングサイトからより良いサービスを提供できると考えています。このサイトにアクセスするには、以下をクリックしてください。

Linux Foundationのカルチャに対するフィードバックは、より適切に、中国のカルチャウェブサイトに反映されることを期待しています。