12

Diffie-Hellman Key ExchangeでYouTubeビデオを見た後、JavaScript(Atwoodの法則)での実装を試してみたかったのです。

Node.jsで次のルールを使用して暗号をスケッチしました。

  • ステップ1:クライアントとサーバーが共有キーについて合意します。

    • クライアントとサーバーは512ビットのプライム公開鍵pKで開始します

    • クライアントは512ビットのプライム秘密鍵kCを生成し、powMod(3、kC、pK)を送信します

    • サーバーは512ビットのプライム秘密鍵kSを生成し、powMod(3、kS、pK)を送信します

    • クライアントとサーバーは、共有キーとしてpowMod(response、privatekey、pK)を使用します

  • ステップ2:コミュニケーション

    • クライアントがデータを送信する前に、Stanford Javascript Crypto Library(256ビットAES、HMAC認証、PBKDF2パスワード強化、およびCCM認証付き暗号化)を使用して共有キーで暗号化されます。

    • サーバーが共有キーを使用してデータを復号化すると、サーバーは新しい512ビットのプライム秘密キーを生成し、SJCL暗号化応答として送信します。

    • クライアントとサーバーは、powMod(3、prevSharedKey、newPrivKey)を使用して新しい共有キーに切り替えます

今、私はいくつかの質問があります。

このようなシステムは、HTTPSや他のアルゴリズムと比較してどの程度安全ですか?そのようなシステムの弱点は何ですか?

セキュリティ/実用性の観点から、セキュリティを強化するために1024ビットキーを使用する方が良いでしょうか?HMAC / PBKDF2 / CCMオプションはやり過ぎですか?共有キーを変調する価値はありますか?読んでくれてありがとう!

4

3 に答える 3

18

あなたのシステムは非常に安全ではありませんが、私はあなたや誰かがこのようなもので遊んでいるのを思いとどまらせようとはしていません。続行する必要があります。ただし、作成したものはすべて「おもちゃ」のシステムであり、「安全」と見なしたり宣伝したりしてはならないものと見なすことが重要です。

セキュリティの質問を2つの部分に分けてみましょう。

  1. 鍵交換はどの程度安全ですか?
  2. 共有キーを取得した後、使用する暗号化はどの程度安全ですか?

(2)が最も簡単なので、最初に答えさせてください。何年にもわたってTLSに取り組み、研究してきたすべての人々よりも賢くない限り、それはひどく安全ではありません。バージョン1.2より前のTLS(ほとんどのサイトでは使用されていません)は、原則として選択暗号文攻撃(CCA)に対して脆弱であり、暗号スーツの選択に応じて実際にはBEAST攻撃に対して脆弱です。そしてSSL2.0はもっとひどく壊れています。

重要なのは、何年にもわたってこれらのプロトコルに取り組んでいる非常に賢い人々が、いくつかの間違いを犯したということです。あなたが私自身でこの種のことに取り組んでいると信じる理由はたくさんありますが、大きな間違いを犯します。基本的な暗号化アルゴリズムは問題ありません。彼らは壊れていません。しかし、プロトコルはそうです。

したがって、SSLの詳細のすべて、なぜそこにあるのか、場合によってはどのように間違っているのかをすべて研究して完全に理解していない場合は、考案したプロトコルがひどいものになることはほぼ間違いありません。

次に質問(2)します。これには2つの問題があります。(a)Diffie-Hellmanは、おそらく必要な種類のセキュリティを提供するようには設計されていません。(b)DHを正しく実装したとは思いません。

2.a:

Diffie-Hellman鍵交換は、正しく行われると、鍵交換に対して安全ですが、認証には何もしません。これが、「安全か」という質問がしばしば間違った質問である理由です。一部の目的では安全ですが、他の目的では設計されていないため、他の目的では非常に安全ではありません。

Josh3737指摘したように、クライアントとサーバーが適切な相手と話していることを知る方法はありません。サムがサーバーでチャーリーがクライアントの場合、マロリーがサムになりすました独自のサーバーをセットアップするのを妨げるものは何もありません。したがって、キャシーは、サムと話していると思って、マロリーとの鍵交換を行うことができます。マロリーは、サムと話すときにチャーリーのふりをすることができます。

このように設定すると、マロリーはサムとチャーリーの中間者として機能できます。チャーリーがサム宛てのデータを送信すると、マロリーはCとMの間の共有キーを使用してデータを復号化し、読み取り(場合によっては変更)してから、MとSの間の共有キーを再暗号化してSに送信します。 。

認証の問題を解決するには、ある種の公開鍵インフラストラクチャ(PKI)が必要であり、これらは本当に苦痛です。SSL / TLSで使用している認証局などのシステムには問題がありますが、それでも最高のシステムです。

2.b:

512ビットの公開モジュラスと512ビットの秘密鍵は十分に強力ではありません。DHキーは大きくする必要があります。2048ビット未満のものは使いません。5年後に誰かが今日の秘密を破ることができることを心配していない1024ビットで逃げることができるかもしれません。

素数がどのように選択されたかについて十分な情報を提供していませんでした。すべてのプライムが機能するわけではありません。モジュラスには「安全素数」を使用する必要があります。そうしないと、攻撃者が離散対数を計算するためのショートカットを利用できます。

于 2013-05-09T17:46:53.297 に答える
7

私は以前にこのような質問を見たことがあります。これは多くの理由で完全に安全 ではありません。その主な理由は、JavaScriptクライアントがサーバーのキーが本物であることを確認できないという事実です。

一言で言えば、SSLがないと、man-in-the-middle攻撃に対して脆弱になります。ブラウザベースのJavaScript暗号化実装はこの事実を克服できません。

于 2012-03-23T03:13:50.607 に答える
0

SSL証明書と中間者攻撃を回避したい場合は、ビットコインブロックチェーンを使用できます。(またはaltcoinブロックチェーン。)

巨大な警告:クライアントは、ブロックチェーンのファイル全体をダウンロードまたは維持する必要があります。

2つの公開鍵と秘密鍵のペアがあります。

CERTpublic CERTprivate

CLIENTpublic CLIENTprivate

名前の登録:

Server -> CERTpublic and name_to_register -> Bitcoin Blockchain

認証された接続:

Client <- CERTpublic <- Bitcoin Blockchain
Client -> CERTpublic(CLIENTpublic) -> Server or Adversary
Client <- No_response_or_incorrect <- Adversary 
Client <- CLIENTpublic(CERTprivate(content)) <- Server
于 2014-01-24T04:08:35.303 に答える