SSL再び
典型的なハンドシェークフェーズの骨子
クライアント |
|
サーバ |
|
32バイトのクライアント乱数 Rclient → |
|
|
← 32バイトサーバ乱数 Rserver, サーバ証明書 |
|
サーバ証明書の検証 |
Eserver(46バイトのプレマスター秘密 Spre) → |
|
48バイトのマスター秘密 Smaster の導出 |
|
48バイトのマスター秘密 Smaster の導出 |
|
確認認証子 macfin → |
|
|
← 確認認証子 mac'fin |
|
mac'finの検証 |
|
macfinの検証 |
鍵導出 |
|
鍵導出 |
基本的な設計方針は、鍵共有プロトコル EB-SIG と同様。ただし、
- クライアントは認証せず、
- マスター秘密は、クライアント乱数、サーバ乱数およびプレマスター秘密の3つから計算し、
- 送信メッセージごとにデジタル署名を添付する代わりに、最後にMACを交換。
クライアント乱数とサーバ乱数の組は、(暗号技術的な)セッション識別子と解釈できる。
マスター秘密の導出
それについて、
- プレマスター秘密を鍵としたときの、クライアント乱数とサーバ乱数の組からなるセッション識別子における値
をマスター秘密としている。
Smaster :=
- MD5(Spre || SHA1("A" || Spre || Rclient || Rserver)) ||
- MD5(Spre || SHA1("BB" || Spre || Rclient || Rserver)) ||
- MD5(Spre || SHA1("CCC" || Spre || Rclient || Rserver)) || ・・・
確認認証子の計算
HMAC ベース。ただし、効率のため、
- handshake_messagesをハッシュ関数の第一引数に
もってきている。そのため、HMACの安全性証明は、そのまま適用できない。
ハッシュ関数とMACを参照。
macfin := macmd5 || macsha1
macmd5 := MD5(Smaster || pad2 || MD5(handshake_messages || Sender || Smaster || pad1))
macsha1 := SHA1(Smaster || pad2 || SHA1(handshake_messages || Sender || Smaster || pad1))
上で、Sender は、macfinの作成者が、クライアントかサーバーかを表す定数。これがないと、偽サーバが、クライアントから受け取った macfin をそのまま送り返す、「反射攻撃」ができてしまう。クワバラ、クワバラ。
鍵導出
やはり、ハッシュ関数を用いて疑似的な疑似ランダム関数を実装。
それについて、
- マスター秘密を鍵としたときの、サーバ乱数とクライアント乱数の組からなるセッション識別子における値
を鍵ブロックとしている。
鍵ブロック :=
- MD5(Smaster || SHA1("A" || Spre || Rserver || Rclient)) ||
- MD5(Smaster || SHA1("BB" || Spre || Rserver || Rclient)) ||
- MD5(Smaster || SHA1("CC" || Spre || Rserver || Rclient)) || ・・・
鍵ブロックの先頭から、クライアントMAC鍵、サーバーMAC鍵、クライアント暗号化鍵、サーバー暗号化鍵、クライアントIV、サーバーIVを取り出して、データ転送フェーズで用いる。
最終更新:2010年06月04日 14:59