web-dev-qa-db-ja.com

クライアントまたはサーバーは、クライアントの公開鍵と秘密鍵のペアを生成する必要がありますか?

モバイルメッセージングアプリがあるとします。ものを管理する中央サーバー(ユーザーのディレクトリ、オンボーディングなど)があり、すべてのクライアントがあります。

私のアプリはプロフェッショナルなので、非対称暗号化を使用してメッセージを安全に送信します。

私の質問は、簡単に言えばクライアントまたはサーバーが公開鍵と秘密鍵のペアを生成する必要がありますか?

クライアントがペアを生成する場合、ペアはクライアント側で生成され、サーバーに送信されます(サーバーの公開鍵で暗号化されている場合があります)。

サーバーがペアを生成する場合、私はもっと複雑なアイデアを思いつきました:

  1. クライアントがシークレットを生成(S
  2. クライアントはサーバーの公開鍵で秘密を暗号化します
  3. クライアントは暗号化されたシークレットをサーバーに送信します
  4. サーバーはサーバーの秘密鍵で暗号化された秘密を復号化します
  5. サーバーはクライアントの公開鍵と秘密鍵のペアを生成します
  6. サーバーは秘密(S)で秘密鍵を暗号化し、メモリから削除します
  7. サーバーは暗号化された秘密鍵をサーバーに送信します
  8. クライアントは最初から持っていた秘密(S)で暗号化された秘密鍵を復号化します
  9. やったー!クライアントは秘密鍵を持ち、公開鍵はサーバー上にあります!!! :)

では、どちらのアプローチが優れているのでしょうか?クライアントまたはサーバーは、セキュリティの観点から公開鍵と秘密鍵のペアを生成する必要がありますか?私のソリューションよりも優れた/より効率的/より安全な方法はありますか?

3
Daniel

私の質問は、要するに、クライアントとサーバーのどちらが公開鍵と秘密鍵のペアを生成する必要があるかということです。

理論では、クライアントは独自の鍵ペアを生成する必要があります。その方法で秘密鍵:

  • クライアントだけが知っている
  • 転送にさらされていません

practiceでは、サーバーがクライアントキーを生成して配布するのを聞くのは珍しくありません。ただし、これは通常、クライアントが鍵とCSR自体を生成できる必要なリソースを欠いている場合にのみ行われます。

  • 限られたプロセッサ
  • 人間の相互作用が必要

(文字通り、私が見たほとんどの「サーバーがキーを渡す」設定は、「私たちのユーザーはあまりにも愚かであり、私たちのサポートグループはそれらすべてを手にしたくない」と煮詰めています。)

サーバーとクライアントを実装しているようです。そのレベルの制御がある場合、-クライアントでクライアントキーを生成を行うのが正しいためです。

6
gowenfawr

クライアントまたはサーバーは公開鍵と秘密鍵のペアを生成する必要がありますか?

それはあなたのデザイン目標が何であるかに依存すると思います:

通信を完全に保護し、送信者と受信者のみが復号化できるようにする場合は、クライアントでキーを生成し、クライアントから離れないでください。クライアントがAndroidまたはiOSアプリの場合、Android KeystoreまたはApple Secure Enclaveがクライアントのキーは別のプロセッサで作成され、アプリにはアクセスできません。サーバーはもちろんです。

サーバーでメッセージの読み取り、アーカイブ、ログ、変更、wtvを実行できるようにするには、サーバーにすべての秘密キー(または各クライアントがサーバーのキーペアを暗号化するプロトコル)のコピーが必要です。その時点で、あなたはプライバシーのすべての見せかけをあきらめます。


1つのパーティがキーを生成し、それを他のパーティに送信する方法について説明した方法は、よく使用されるスキームです。実際、これがまさに、TLSのRSAキー確立モードが機能する方法です。クライアントは、セッションキーの派生元のサーバーにプリマスターシークレットを送信します(スライドは から借りられます)Royal Holloway University ofロンドンのサマースクールトーク )。

enter image description here

3
Mike Ounsworth