モバイルメッセージングアプリがあるとします。ものを管理する中央サーバー(ユーザーのディレクトリ、オンボーディングなど)があり、すべてのクライアントがあります。
私のアプリはプロフェッショナルなので、非対称暗号化を使用してメッセージを安全に送信します。
私の質問は、簡単に言えばクライアントまたはサーバーが公開鍵と秘密鍵のペアを生成する必要がありますか?
クライアントがペアを生成する場合、ペアはクライアント側で生成され、サーバーに送信されます(サーバーの公開鍵で暗号化されている場合があります)。
サーバーがペアを生成する場合、私はもっと複雑なアイデアを思いつきました:
S
)S
)で秘密鍵を暗号化し、メモリから削除しますS
)で暗号化された秘密鍵を復号化しますでは、どちらのアプローチが優れているのでしょうか?クライアントまたはサーバーは、セキュリティの観点から公開鍵と秘密鍵のペアを生成する必要がありますか?私のソリューションよりも優れた/より効率的/より安全な方法はありますか?
私の質問は、要するに、クライアントとサーバーのどちらが公開鍵と秘密鍵のペアを生成する必要があるかということです。
理論では、クライアントは独自の鍵ペアを生成する必要があります。その方法で秘密鍵:
practiceでは、サーバーがクライアントキーを生成して配布するのを聞くのは珍しくありません。ただし、これは通常、クライアントが鍵とCSR自体を生成できる必要なリソースを欠いている場合にのみ行われます。
(文字通り、私が見たほとんどの「サーバーがキーを渡す」設定は、「私たちのユーザーはあまりにも愚かであり、私たちのサポートグループはそれらすべてを手にしたくない」と煮詰めています。)
サーバーとクライアントを実装しているようです。そのレベルの制御がある場合、-クライアントでクライアントキーを生成を行うのが正しいためです。
クライアントまたはサーバーは公開鍵と秘密鍵のペアを生成する必要がありますか?
それはあなたのデザイン目標が何であるかに依存すると思います:
通信を完全に保護し、送信者と受信者のみが復号化できるようにする場合は、クライアントでキーを生成し、クライアントから離れないでください。クライアントがAndroidまたはiOSアプリの場合、Android KeystoreまたはApple Secure Enclaveがクライアントのキーは別のプロセッサで作成され、アプリにはアクセスできません。サーバーはもちろんです。
サーバーでメッセージの読み取り、アーカイブ、ログ、変更、wtvを実行できるようにするには、サーバーにすべての秘密キー(または各クライアントがサーバーのキーペアを暗号化するプロトコル)のコピーが必要です。その時点で、あなたはプライバシーのすべての見せかけをあきらめます。
1つのパーティがキーを生成し、それを他のパーティに送信する方法について説明した方法は、よく使用されるスキームです。実際、これがまさに、TLSのRSAキー確立モードが機能する方法です。クライアントは、セッションキーの派生元のサーバーにプリマスターシークレットを送信します(スライドは から借りられます)Royal Holloway University ofロンドンのサマースクールトーク )。