SSLハンドシェイクでは、クライアントとサーバーの両方がそれぞれの乱数を生成します。次に、クライアントは事前マスターシークレットを生成し、それをサーバーの公開鍵で暗号化します。しかし、なぜクライアントは事前マスターシークレットを生成してサーバーに送信できないのでしょうか。なぜクライアントとサーバーがランダムに必要なのですか?それはマスターシークレットのエントロピーに寄与するためですか、それともDHなどの他の鍵交換アルゴリズムとの均一性のためですか?
From HTTPS接続の最初の数ミリ秒 :
マスターシークレットは、クライアントとサーバーのランダム関数です。
master_secret = PRF(pre_master_secret,
"master secret",
ClientHello.random + ServerHello.random)
クライアントとサーバーの両方がマスターシークレットを計算できる必要があります。クライアントでプレマスターシークレットを生成し、justサーバーに送信すると、クライアントがマスターシークレットを見つけることができなくなります。
これは、キー生成ルーチン全体がクライアントが生成した値に基づいていたことを意味します。中間者攻撃がハンドシェイクを再生した場合、同じプレマスターシークレットが送信され、接続に使用されます。サーバーにランダムな値(ServerHello.random
)は、MACシークレットがClientHello.random
が繰り返されるため、MACキーと暗号化キーが異なり、 リプレイ攻撃 が防止されます。
セッションの再開時に役立ちます
TLSでは、マスターシークレットはPRF関数のサーバーとクライアントのランダムバイトで使用され、キーブロックを計算します。
key_block = PRF(SecurityParameters.master_secret,
"key expansion",
SecurityParameters.server_random +
SecurityParameters.client_random)
次に、キーブロックが分割され、さまざまな操作に使用される6つのキーが提供されます。
セッションを再開すると、同じマスターキーがキーブロックの生成に使用されます。したがって、クライアントとサーバーのランダムバイトを使用することで、すべてのハンドシェイクでキーブロックが異なることが保証されます。
それはマスターシークレットのエントロピーに貢献することですか...
はい。これにより、両方の当事者がマスターシークレットに貢献することが保証されます。
マスターシークレットは、一括暗号化と認証に使用される後続のキーを取得するために使用されるシードです。
...またはDHなどの他の鍵交換アルゴリズムとの均一性のために?
いいえ。Diffie-Hellmanは、ランダムなシークレット値a
(またはb
)を選択し、相手はA=G^a
(またはB=G^b
)。貢献行動はDiffie-Hellmanに組み込まれています。
他のキー合意スキームがあります。 RSAはキー転送方式ですが、サーバーがプリマスターシークレットに貢献する機会はありません。つまり、RSAキー転送に固有の寄与動作はありません。
RSAキートランスポートの場合、両方の当事者がマスターシークレットに貢献するようにする方法は次のとおりです。
master_secret = Transform(premaster_secret + client_random + server_random)
寄与動作が解決する実際的な問題は、壊れているか役に立たない乱数発生器を持つIoTデバイスを想像してみてください。寄与動作は、クライアントがランダム性を欠いている場合でも、チャネルが[ほとんど]安全であることを保証します。