20

典型的な https Web シナリオで、ブラウザーとサーバー間の SSL ハンドシェイクについて少し混乱しています。

私がこれまでに理解したことは、SSL ハンドシェイクの過程で、クライアント (この場合はブラウザー) がランダムに選択された対称鍵を公開鍵 (サーバーから受け取った証明書) で暗号化するということです。これはサーバーに送り返され、サーバーは秘密鍵を使用してそれ (対称鍵) を復号​​化します。この対称キーは、セッションの残りの部分で使用され、両端でメッセージを暗号化/復号化します。そうする主な理由の 1 つは、対称鍵を使用した高速な暗号化です。

質問

1) ブラウザは、この「ランダムに」選択された対称キーをどのように選択して生成しますか?

2) 開発者 (またはブラウザ ユーザー) は、対称キーを生成するこのメカニズムを制御できますか?

4

2 に答える 2

18

これは、 HTTPS接続の確立がどのように機能するかについての非常に良い説明です。両当事者 (クライアントとサーバー) がセッション キーを取得する方法の概要を説明します。このプロセスは「キー アグリーメント プロトコル」として知られています。

  1. クライアントは、48 バイトの「プレマスター シークレット」ランダム値を生成します。
  2. クライアントはこれらのバイトにランダム データを埋め込んで、入力を 128 バイトに等しくします。
  3. クライアントはそれをサーバーの公開鍵で暗号化し、サーバーに送信します。
  4. 次に、マスターキーは次の方法で両当事者によって生成されます。

    master_secret = PRF(
       pre_master_secret, 
       "master secret", 
       ClientHello.random + ServerHello.random
    )
    

PRF は、仕様でも定義されている「疑似乱数関数」であり、非常に巧妙です。MD5 と SHA-1 ハッシュ関数の両方のキー付きハッシュ メッセージ認証コード (HMAC) バージョンを使用して、シークレット、ASCII ラベル、およびシード データを組み合わせます。入力の半分が各ハッシュ関数に送信されます。MD5 と SHA-1 の弱点に直面しても、攻撃に対して非常に耐性があるため、賢いです。このプロセスは、それ自体にフィードバックし、無限に反復して、必要な数のバイトを生成できます。

この手順に従って、48 バイトの「マスター シークレット」を取得します。

于 2010-10-14T18:10:13.300 に答える