web-dev-qa-db-ja.com

MitMでDiffie-Hellman鍵交換を実行できないのはなぜですか?

"Diffie-Hellman Key Exchange"の平易な英語での選択された回答を読んだ後 5回私の人生では、それがMitM攻撃から私をどのように保護するか理解できません。

次の抜粋( tylerlの答え から)を考えます:

  1. 2つの素数gpを考え出して、それらが何であるかを説明します。
  2. 次に、秘密の番号(a)を選択しますが、誰にも教えません。代わりにgを計算しますamodpそして、その結果を私に送ります。 (aから来たので、[〜#〜] a [〜#〜]と呼びます。 )。
  3. 私は同じことをしますが、秘密番号bと計算された番号[〜#〜] b [〜を呼び出します#〜]。したがって、gを計算しますbmodpそして結果を送信します( "と呼ばれます) [〜#〜] b [〜#〜]")
  4. さて、あなたは私があなたに送った番号を受け取り、itでまったく同じ操作を行います。Bamodp
  5. 私はあなたが私に送った結果で同じ操作をするので、Abmodp

以下は、Alphaがネットワークを制御する同じ5つのステップです。

  1. gpを送ろうとしたが、Alphaが傍受したgpを学習します
  2. aを考え出して、ga mod pの結果を送ってみる/(A)、ただしAlphaは傍受して学習するA
  3. Alphaはbを表示し、gb mod pB
  4. Ba mod pを実行します
  5. アルファ版Ab mod p

このプロセス全体で、Alphaはあなたのふりをして、同じ方法を使用して私と共有秘密を作成します。

これで、あなたとAlphaの両方、およびAlphaと私には、それぞれ2つの秘密の共有があります。

秘密で私に話しかけるのは安全だと思うようになりました。秘密で暗号化されたメッセージを送信すると、AlphaはあなたとAlphaが作成した秘密を使用してメッセージを復号化し、Alphaと私が作成した秘密を使用して暗号化してから送信します。 。私があなたに返信すると、アルファは同じことを逆に行います。

ここで何か不足していますか?

100
orokusaki

Diffie-Hellmanはキー交換プロトコルですが、認証については何もしません。

これを確認するには、高レベルの概念的な方法があります。コンピュータネットワークと暗号化の世界では、実際に見ることができるのはゼロと1つのワイヤーで送信されたものだけです。エンティティは、送信できるゼロまたは送信できないゼロによってのみ互いに​​区別できます。したがって、ユーザー「ボブ」は実際には、非ボブが計算できないものを計算する彼の能力によってのみ定義されます。誰もが同じコンピューターを購入できるので、ボブはボブだけが知っているいくつかの価値の知識によってのみボブになることができます。

提示する生のDiffie-Hellman交換では、ランダムな秘密の値を即座に生成することになっているエンティティに話しかけ、それを使用します。誰もがそのようなランダムな生成を行うことができます。プロトコルのどこにも、特定のボブだけが実行できる操作はありません。したがって、プロトコルはいかなる種類の認証も実行できません-誰と話しているのかわかりません。認証がなければ、偽装が可能です。これには、 Man-in-the-Middle としてよく知られている同時二重の偽装が含まれます。せいぜい、生のDiffie-Hellmanは弱い機能を提供します。誰と話しているのかはわかりませんが、セッションを通じて同じエンティティと話していることはわかっています。


単一の暗号化アルゴリズムはあなたを遠くに連れて行きません;重要な通信プロトコルはいくつかのアルゴリズムを組み合わせて、明確なセキュリティ特性を実現します。主な例は SSL/TLS ;です。もう1つは [〜#〜] ssh [〜#〜] です。 SSHでは、Diffie-Hellman鍵交換が使用されますが、サーバーの公開部分(そのgb modp)はサーバーによってsignedです。クライアントは、サーバーの公開鍵(通常はRSAまたはDSAタイプ)を(前の初期化手順から)記憶しているため、適切なサーバーと通信することを知っています。上記で説明したモデルでは、正当なサーバーはクライアントが記憶している公開鍵に対応する署名秘密鍵の知識によって定義され、模倣者と区別されます。その署名は認証を提供します。 Diffie-Hellmanは、その接続のすべてのデータ交換を暗号化および保護するために使用される共有シークレットを生成します(対称暗号化とMACアルゴリズムを使用)。

したがって、Diffie-Hellmanはそれ自体で必要なすべてを実行するわけではありませんが、デジタル署名からは取得できない便利な機能、つまり key exchange を提供します。実際に交換されるデータを暗号化するために必要な一時的な共有シークレットを提供します。

158
Tom Leek

トムは、Diffie-Hellmanが中間者に対して安全ではない理由について、良い説明をしました。これでOPの元の質問に答えますが、おそらく一部の読者には(妥当な)フォローアップの質問を残します:公開鍵(非対称)暗号化を使用してメッセージの機密性を確保し、D-Hを完全に削除しないのはなぜですか?これを行わない理由はいくつかあります。

  • 署名のみをサポートし、メッセージの暗号化はサポートしないアルゴリズム(ECDSAなど)があります。
  • 対称的な暗号化と復号化は、非対称的に行うよりもはるかに高速です
  • おそらく最も重要なのは前方秘密を確実にしたいということです。結局のところ、いずれかの通信パートナーの秘密鍵が何らかの時点で危険にさらされていることは不可能ではありません。ここで、非対称暗号化のみに依存している場合、そのパートナーに送信したすべてのメッセージが、攻撃者によって振り返って解読される可能性があります。対照的に、Diffie-Hellmanを使用する場合、正確にはephemeral Diffie-Hellmanの場合、通信セッションごとに新しいDHキーペアを生成し、後で破棄します(=格納しない)。 、後でメッセージを解読することは不可能です。
58
zinfandel

DH鍵交換後、両方の当事者は自分が計算した鍵を知っています。中間者が接続に侵入していない場合、両方の当事者が同じ鍵を持ちます。接続に違反した場合、キーは異なります。一方の当事者が他方の当事者に使用しているキーを尋ねる手段がある場合、真ん中の人は、正当な当事者が行ったのと同じ方法で応答できる場合にのみ、検出されないままになることができます。多くの場合、デジタル署名を使用して質問に回答しますが、なりすましを難しくするために、音声通信などを介して質問に回答することもできます。音声アプリケーションが参加者に現在の暗号化キーを示し、参加者が範囲と人気の映画スター(マリリンモンローなど)を任意に選択し、相手に、マリリンモンローの最高の声で15桁目から25桁目を読むように要求した場合、彼の前に番号を持っている実際の参加者は、すばやく流暢にそれを行うことができ、MITM攻撃がなければ、数字は最初の当事者が見た数字と一致します。中間者攻撃者は問題を検出するのに問題はなく、適切な数字を言っているマリリンモンローの悪い模倣をしている正当なコミュニカントの音声ファイルを偽造できる可能性があります。本物と同じくらい早くそれを行うのに苦労しています。

つまり、各参加者が他の参加者が攻撃者よりも効率的に番号を使用して実行できることを知っている場合、DH自体がMITM攻撃に対して堅牢になる可能性があります。他のプロトコルは一般にDHと組み合わせて使用​​されます。これは、認証プロセスを自動化するのに役立ち、暗号化に依存しないほとんどの形式の認証(音声、フレージングなど)は人間による検証が必要であるためです。さらに、エンティティが見知らぬ人からのコミュニケーションを求めることがしばしば必要になります。 Acme Bankの担当者と話したい場合は、中間者の詐欺師が偽の「Acme Bank」オフィスを設置して私の電話をかけ、偽のリビングルームの誰かに私の言うことすべてを現実のものに中継させることができます。アクメ銀行、誰も賢明ではありません。実際のAcme Bankの従業員がマリリンモンローを真似できるかどうかわからない場合、私は詐欺師の模倣が同じではなかったことを知る方法がありません。

3
supercat

Tom Leekの回答でより正確に1点指摘する必要があります。「SSHではDiffie-Hellman鍵交換が使用されますが、サーバーのパブリック部分(そのgb mod p)はサーバーによって署名されています。」

実際には、DH鍵交換全体が署名されています。署名のみgb mod pでは不十分です。SSHサーバーに接続し、後で[SSH-TRANS]パケットを再生するだけで、SSHサーバーを偽装することができます。これは、現在のセッションのデータについての知識を証明するものではありません。それはgを省略しますa mod p、SSH ID文字列、プロトコルネゴシエーション。

認証は、2つのパーティがSSH ID文字列とプロトコルネゴシエーションメッセージを交換した後に行われ、クライアントはgを含むDiffie-Hellmanキー交換メッセージを送信しますa mod p。

サーバーはgを計算しますb mod pとすべての重要な情報をハッシュします:H = hash(context || sig_pub || ga mod p || gb mod p || gab mod p)with context = SSH ID strings ||プロトコルネゴシエーションメッセージ。

次に、そのハンドシェイクハッシュに署名します:sig = signature(sig_priv、H)と(sig_pub、gb mod p、sig)をクライアントに送信します。

このようにして、署名アルゴリズムを破った場合を除いて、だれも偽装することはできません。

2
Benoît Morgan

DHは一般的に中間者攻撃に対して耐性ではありません。

アリスとボブ(A <-> B)が共有シークレットを設定できる場合。次に、フランクはアリス(A <-> F)と共有秘密を設定できます。同時に、フランクはボブ(F <-> B)と2番目の(異なる)共有秘密を設定できます。その後、フランクはA-> Fメッセージを復号化し、再暗号化してボブF-> Bに送信できます。

*そのため、メッセージが実際にアリスから送信された(署名された)ことを確認する方法が必要です。以前に共有されたシークレット(他のチャネルを介して配信されたもの)を使用するか、認証局を使用して(信頼をプロキシするため)。または他の方法。

CAを少しだけ信頼する場合、AliceはBobとのDH共有秘密をセットアップし、CAからの証明書でメッセージに署名できます。ボブは、メッセージがCAによって署名されたことを確認します。メッセージに必要な証明書がないため、フランクはメッセージを偽造できません。

これで、アリスとボブは秘密を共有しました。フランクは真ん中に自分の道を偽ることができませんでした。ただし、CAは共有シークレットの作成に関与していません(途中で送信された部分に署名するだけです)。そのため、CAは悪役としてもプレイできません。フランクが5ドルのレンチで彼らを脅迫したとしても。

*少し単純化していますが、それは一般的な考え方です。

2
DarcyThomas

ここで、英語の言語記述能力が失敗します。 Diffie helmanは、帯域外のサードパーティエンティティがキーの配布やIDの検証を支援できる場合、mitmに耐性があります。文献に記載されているように、主に定義されているのは、受信者、またはほとんどの場合、鍵または証明書に添付された人物の身元を取り巻く信頼の接続されたWebです。

0
munchkin