4

非常に機密性の高いデータ (企業秘密であるソース コード) を交換するシステムが必要です。私は Crypto++ を使用するので、実際にはすべての暗号化アルゴリズムを使用できますが、業界標準を使用することを本当に好みます。

現在、私はこれらの方法について考えています:

  1. サーバーに 2048/4096 ビットの RSA キーを生成させ、公開キーをクライアントに送信し、クライアントにデータを暗号化してからサーバーに送信させます。
  2. AES-256 キーを交換するには、Diffie-Hellman (正確には Diffie-Hellman-Merkle) などのキー交換方法を使用します。
  3. TLS 接続を開始し、サーバーに AES キーを直接伝えます。

どのアプローチを使用する必要があると思いますか? 合理的である限り、パフォーマンスは気にしません。セキュリティが重要です。それらのいずれでもない場合は、別の方法を提案してください。

PS: AES-Twofish-Serpent のような対称アルゴリズムでチェーンを使用する場合があります。

編集: 推奨されるソフトウェアは、独自の使用を制限しないライセンスに含まれている必要があります。LGPL は、取得しなければならないほど制限的です。それはGPLを除外します。

4

3 に答える 3

11

独自のキー交換やキー プロビジョニング プロトコルを開発しないでください。これは歴史的にほとんどの製品を壊すものであり、あなたが暗号技術者 (暗号化の経験を持つプログラマーではない) でない限り、間違いを犯す可能性があります。

SSL/TLS などの市販のプロトコルを使用します。例えば。相互認証用のRSAキーペアで初期化されたTLSとAESセッションキーは、あなたが説明するものに適しているように聞こえます

更新しました

ブルース・シュナイアー

「同僚はかつて、世界は応用暗号を読む人によって設計された悪いセキュリティシステムでいっぱいだと私に言いました。」

エリクソンは彼の投稿で、独自のキー プロビジョニングおよび管理プロトコルの設計に欠陥がある理由をすでに十分に示しています。自信過剰な開発者のおかげで、マロリーが生きていて非常にうまくやっている理由を強調したいだけです。

クライアントが公開鍵で暗号化し、ドキュメントを返送する、提案するスキームを設計します。うまく機能していますが、1 年後には証明書の有効期限が近づいています。ユーザーに署名してもらいたい公開鍵を含む新しい証明書をクライアントに電子メールで送信すると、ドキュメントが暗号化されます。あなたには知られていないことですが、あなたの ISP 管理者は過去 4 か月間、リモート マシンを介してすべての IP トラフィックをルーティングするための賄賂を受け取りました。あなたの電子メールは配布前に傍受され、添付された証明書は別のものに置き換えられます。すべてのクライアントが、他人の秘密鍵で暗号化された超機密文書を送信しています。アプリケーションはそれぞれを復号化して保存し、公開鍵で暗号化し、トラフィックを転送します。あなたは起こっていることさえ知らないでしょう、

投稿で、チェーンアルゴリズムのオプションとして言及しています。誰もあなたに暴力を振るうつもりはありません。あなたの弱点は鍵の管理であり、攻撃は何らかの形のソーシャル エンジニアリングを利用して、誰かが間違った鍵を使用していたり​​、秘密鍵をさらけ出したりしているのをだます (繰り返しますが、賄賂は大いに役立ちます)。業界で合意されたプロトコルには、中間者攻撃を防ぐための手順があり、指定されたキーの使用と信頼できる機関を認識する PKI インフラストラクチャに依存している可能性があり、証明書失効リストのチェック手順を検証に追加するなどです。 key, you decrypt with private' は、シークレットを安全なものにしません。

于 2009-10-12T22:46:25.637 に答える
3

コンテンツを暗号化するために、既存の S/MIME (または CMS) 実装と堅牢な暗号化モジュールを使用することをお勧めします。

S/MIME エンベロープ データは、暗号化されたデータを「保管中」に保存するための適切な形式です。エンベロープには、使用されるアルゴリズムとキーに関する情報が記録されるため、承認された受信者が後で必要なときにその情報を利用できるようになります。

また、「最良の」アルゴリズム (ECDH 鍵協定など) をサポートしていなくても、一般的なプログラマーが作成したものよりも、優れたライブラリに脆弱性が存在する可能性ははるかに低くなります。暗号解読よりも実装エラーによってセキュリティが侵害される可能性がはるか高いため、これらのエラーを最小限に抑えることは理にかなっています。


正当なプロトコルでは、公開鍵は少数の信頼できる発行者の 1 人によって署名され、その公開鍵は何らかの安全な手段によって「帯域外」で配布されます。メッセージ送信者への公開鍵を取得するための安全な手段が既にある場合、わざわざ別の手段を送信する必要はありません。そうしないと、めちゃくちゃになります。

TLS と S/MIME は、すべてのクライアントで既知の CA 証明書のセットを持っていることに依存しています。これらは、サーバーの公開鍵に署名するために使用され、クライアントが鍵の置き換えの試みを検出できるようにします。プロトコル自体はブートストラップできません。「トラストアンカー」をアウトオブバンドで配布する安全な方法が必要です。

また、RSA は対称暗号に比べて非常に遅いことにも注意してください。実際のプロトコルは、AES のような対称アルゴリズムの「コンテンツ暗号化キー」を生成し、RSA 公開キーを「キー暗号化キー」として使用して、メッセージ受信者のコンテンツ暗号化キーを暗号化します。


したがって、主な問題は、公開鍵をクライアントに安全に渡すことです。それができる場合は、オプション #1 または #2 のいずれかが適しています。別の公開鍵を「帯域内」で送信しようとするのではなく、その公開鍵を使用するだけであると仮定します。実際、CMSでは、オプション #1 は「鍵トランスポート」と呼ばれ、オプション #2 は「鍵合意」と呼ばれます。

実際には、「サーバー」は、すでによく知られている CA によって発行された証明書を使用するか、クライアントが証明書のハッシュを電話で伝えたものと比較するか、崖の表面に刻み込むことができます。または何でも。重要なことは、すべてのセキュリティは証明書の完全性に依存するということです。改ざんから保護する必要があります。

Crypto++ は「業界標準」ですが、そのセキュリティは使用方法によって異なります。 Jerry が Kramer に語ったように、「ドアは…閉じている必要があります!」 設計が不十分なプロトコルで Crypto++ の暗号化プリミティブを使用すると、どこにも行き着きません。そのため、優れた暗号化モジュール (暗号化プリミティブ) と共に CMS (上位レベルのプロトコル) を使用することを強調しています。

于 2009-10-12T23:24:52.613 に答える
0

ssh はどうですか?(たとえば、ssh の rsync) ?

于 2009-10-13T22:19:10.187 に答える