web-dev-qa-db-ja.com

Webメッセージングアプリの非対称/エンドツーエンドの暗号化

バックグラウンド

私は、メッセージング用の安全で持続可能なWebアプリを設計しようとしています。安全なWebアプリケーションを作成する方法を学ぶことが目的です。

アプリケーションは、Webベースのクライアントの場合はJavaScriptで記述され、サーバー側の場合はPHP)で記述されるものとします。

Webアプリケーションを使用するクライアントは、さまざまなデバイスでサービスを使用できるようにログインします。

その後、クライアントはメッセージを他のユーザーに送信できます。中間者が平文でメッセージを読むことができなくても安全です。サーバーがメッセージを読み取れるようにしたくないので、メインの暗号化はクライアント側で行う必要があります。


考え

  • SSL/TLS-サーバーとの有効な通信を確保
  • RSA-非対称暗号化-暗号化キーの暗号化用
  • AES-未知の量のデータ、最も一般的にはプレーンテキストを暗号化する

アプリケーション全体が明らかにSSL/TLSを使用して構築され、クライアントとサーバー間の安全で検証された通信が可能になります。

意図した関係者だけが送信データにアクセスできるようにするために、非対称暗号化が使用されます。すべてのクライアントには、クライアント側に格納された独自の秘密鍵と、データベースにユーザーに接続されたサーバーに格納された公開鍵があります。

RSAは有限のデータサイズしか処理できないため、アリスはボブにメッセージを書きたい場合、強力なAESキーでデータを暗号化します。ボブだけがメッセージを読めるようにするために、ボブはデータベースからボブの公開鍵を取得し、生成したAESキーをそれで暗号化します。暗号化されたメッセージは、使用された鍵と一緒に、ボブの公開鍵で暗号化されてサーバーに送信されます。

ボブはこのメッセージ/キーペアをサーバーから取得します。ボブは、アリスのメッセージの鍵を暗号化するために使用された公開鍵に関連する秘密鍵を持っているので、彼と彼だけが、使用された鍵をプレーンテキストで取得できます。この暗号化されていないキーを使用して、メインメッセージを復号化し、プレーンテキストとして読み取ることができます。


懸念

公開鍵と秘密鍵のペアはサーバー側で生成する必要があります。これにより、秘密鍵がユーザーに送信されて使用されます。どのようにしてこれを安全にすることができますか?どの仲介者も秘密鍵を取得して、アリスのすべてのメッセージを復号化するためにさらに使用できるためです。

サーバーがユーザーが送信するメッセージを認識しないようにするために、サーバーは秘密鍵にアクセス/保存できません。これにより、キーがクライアント側に保存されます。Javascriptを使用して、セキュリティや安全なデータの永続性にめったに関連付けられていない言語とプラットフォームを使用します。セキュリティが私の主な関心事なので、秘密鍵を適切に保存しないことが大きな問題です。

ユーザーがログインして別のデバイスからアプリケーションを使用したい場合、秘密鍵もそこに「魔法のように」表示される必要があるとします。とにかくサーバーに秘密鍵を強制的に保存させる。この暗号化/キー管理を行う他の方法はありますか?


質問の明確化

上記のトピックが長すぎて読めない場合、混乱している場合、または急いでいる場合は、以下に簡単な質問を示します。

間で送信されるメッセージがこれらの2者のみが読み取ることができるようにするにはどうすればよいですか?

私/サーバーまたはそのことに関して他の誰かが自分のメッセージを読むことができることをユーザーに保証するにはどうすればよいですか?

彼らが秘密鍵をクライアント側に安全に保存する方法である場合、それはどれほど悪いですか?

8
Alex

私はあなたのスキームに追加の問題/課題があると思います:サーバーによって生成されたキーペアの問題のほかに、このスキームは中間の攻撃にも対処できます:AはBのキーを要求し、サーバーは彼のキーで応答します独自のキーC。サーバーはBを再度復号化、読み取り、暗号化し、新しい暗号文をBに送信できます。サーバーを使用して通信が行われている限り、AもBも通知しません。これを防ぐには、キー管理サーバーとメッセージサーバーを分離する必要があります。最良のケースでは、たとえば、pgpのようなアクティブなコミュニティキーサーバーを使用します。

とにかく、キー管理が正直に行われていると仮定すると、ハイブリッド暗号化がうまくいくはずです。

鍵の生成については、 CryptoJS をご覧ください。私が正しく覚えていれば、それは(ほぼ)鍵も生成できる本格的な暗号化フレームワークです。 html5の local storage API を使用して、クライアント側のキーを保存できます。

4
user3363866