Diffie–Hellman(D-H)鍵交換(TLS)の場合、サーバーは素数p
およびジェネレーターg
を生成します。これは、pを法とする原始根です。
SSL/TLS(nginxなど)でWebサーバーを設定する場合、ディレクティブssl_dhparam dhparam4096.pem
を使用できます。dhparam4096.pem
ファイルは、openssl dhparam -out dhparam4096.pem 4096
を使用して生成できます
これらのD-Hパラメータの目的は何ですか?
それらは公開できますか? (つまり、dhparam4096.pem
ファイルを公開できますか?)
これが私のdhparam4096.pem
ファイルの内容です。
これは4096ビット整数の16進数表現のようですが、それで正しいですか?
-----BEGIN DH PARAMETERS-----
MIICCAKCAgEAsb8mBiOtYJZ3XR7f/rCXQwpAAnUPXf7l9pwjYxxy30A7rIzMTrsz
bXuhhEmzroJcDqKbu2nIzOBNO6HuyQ3n9x/ZbY5kiEt6q7UrB5jC9LwyPASZhd/F
6xLC7yqFs9sdCaXzuyMS4Ep5sPH6lOvftdsuGZZF9HriTepv/lpD1cPtab+3vHZX
IELVc2WBwVzvNRGd/SQB8RJ+NNF8IseCV/pb/tb67O1p7sn+JsD5xgNB7Lte/XjD
QBXv86aNuI2Z6zAuCiQsQ4rJuWcdnyAz0+zW9DRHz0osB1+IfHYcf4tNmvMKbC8E
u/vI+Q2WsMXkbTyhWibV2zH8cXdfsj5xpIgtbxm4G1ELGFgqyX9LD0IddXE7Md86
qwoKSTBNOyCIEZwwNfKDXY0b7zzObv7b3//J7gM323bAcm9g3uVaYBxF7ITd/jGm
AxpnF55mfhAOYemPZtNinnPAdvqf6BhZe29wfVC1yCIhg7ec9spRaFn2GgW0eL3d
q/+Ux8DJBtzKE10YyLa7bh1Dhml/xtA7rpqLL4+jg5c6lLEvSGmAZtm879NYS0za
33/2LN0/KB4z46Ro5hwqq3UIIe8oDsxdlNGb0mb9F0lKw5//J24PK/t11qMt8yuG
oKUE7TkDfwXlEBxd/ynW2/kLIjhG1JG55Vz8GWet8+ZGzfl/VQeUb9MCAQI=
-----END DH PARAMETERS-----
これらのDHパラメータの目的は正確には何ですか?
これらのパラメーターは、OpenSSLが Diffie-Hellman(DH)key-exchange を実行する方法を定義します。あなたが正しく述べたように、それらにはフィールド素数p
とジェネレータg
が含まれています。これらのパラメーターをカスタマイズできるようにすることの目的は、誰もがこのために自分のパラメーターを使用できるようにすることです。これは Logjam 攻撃(4096ビットのフィールドプライムには実際には適用されません)の影響を受けないようにするために使用できます。
それで、彼らは何を定義しますか?
Diffie-Hellman鍵交換は次のように動作します。
サーバーBobは、これらのパラメーターを使用して_B=g^b mod p
_を計算します。彼は_(B,g,p)
_を_A=g^a mod p
_と一緒に自分で計算するクライアントアリスに_K=B^a mod p
_を送信します。彼女はA
をボブに送信し、彼は_K=A^b mod p
_を計算します。 A^b=g^(a*b)=g^(b*a)=B^a mod p
が保持しているため、両方の当事者が共有鍵に同意します。パラメータp
およびg
は、この鍵交換のセキュリティを定義します。 p
を大きくすると、共有シークレットK
を見つけるのが非常に難しくなり、受動的な攻撃者から身を守ることができます。
そして、なぜそれらを事前に計算しなければならないのですか?
素数を見つけることp
は、p
が素数である_p=2q+1
_が保持するq
の値を見つけることを意味します。次にp
はsafe primeと呼ばれます。
そのような素数を見つけることは実際には計算量が多く、接続ごとに提供することができないため、事前計算されています。
彼らは公開できますか?
はい、それらを公開するリスクはありません。実際、Diffie-Hellman(DH)鍵交換を伴うすべての鍵交換のために送信されます。たとえば RFC 5114 で標準化されているそのようなパラメーターはいくつかあります。パブリッシングで起こり得る唯一の問題は、強力な攻撃者がそれらに対して何らかの計算を実行することに興味を持ち、 Logjam攻撃 を実行できるようにすることです。ただし、パラメーターは4096ビットのフィールドプライムp
を使用するため、これはリスクではありません。
それらを公開することがリスクではない理由を説明するには、上記の鍵交換の説明を確認し、パラメータは計算のベースとしてのみ使用されますが、すべての秘密(_a,b
_)は_g,p
_から完全に独立しています。
Diffie Hellman Key Exchangeのopenssl wikiページ から:
アリスとボブが相互に通信したい場合、それらは最初に大きな素数pとジェネレーター(またはベース)g(0 <g <p)の間で合意します。
アリスは秘密の整数a(彼女の秘密鍵)を選択してから、g ^ a mod p(彼女の公開鍵)を計算します。ボブは自分の秘密鍵bを選択し、同じ方法で自分の公開鍵を計算します。
そのため、アリスは常に同じ秘密鍵を持ちますが、DHパラメータgとpのセットごとに、対応する異なる公開鍵を取得します。
そのページのさらに下にそれは言う:
パラメータの生成はコストのかかるプロセスになる可能性があるため、通常これは事前に1回行われ、同じパラメータのセットが多くの鍵交換で使用されます。
そして Diffie Hellmanパラメータのopenssl wikiページ には次のように書かれています:
完全転送秘密暗号スイートを使用するには、Diffie-Hellmanパラメータを(サーバー側で)設定する必要があります。
静的Diffie Hellman(DH)が使用される場合(Ephemeral Diffie Hellman(EDH)とは対照的に)、DHパラメーターはサーバーに設定され、実際に証明書に埋め込むことができるため、公開されます この回答を参照 =。秘密はアリスとボブの秘密鍵から来ています。
DHパラメータの目的は、 セッション 内のメッセージのトランスクリプトを暗号化するために使用されるシークレット(素数グループに属する大きな素数)を交換することです。
エフェメラルDHはフォワードセキュリティを提供します。つまり、セッションの終了時にセッションキー(セッションの最初に交換)が削除されます。したがって、攻撃者は最後のセッションを超えて2つのパーティ間で交換されたメッセージを取得できませんでした(各セッションには、終了時に常に削除される異なる秘密鍵があるため)。