3

これは、プログラミングの問題というよりも、ソフトウェアエンジニアリングの問題です。私はタイトルをできるだけ関連性のあるものにするように努めました。誰かがそれをより適切に表現できると感じたら、私に知らせてください。

そこで、非同期を使用したインスタントチャットWebサービスを開発してきました。javascriptとPHP。アプリケーションの背後にある主なセールスポイントは、最大限の秘密です。ライブメッセンジャー、Yahooメッセンジャー、IRC、Skypeなど、多くのインスタントチャットアプリがあります。しかし、私をパラノイドと呼んでください。しかし、ユーザーに公開される制御はほとんどなく、ほとんどの場合プライバシーの問題を完全に無視しているように見えるため、ソフトウェアの背後にある企業を信頼することはできないと感じました。他にも多くのセキュア/プライベートIMアプリがあることは承知していますが、独自のアプリを作成することにしました。SSLを使用して、すべての使用ポイント(user-> database-> user)間の通信を暗号化します。

現時点では、メッセージ自体はプレーンテキストのままです。PHPのさまざまな暗号化ライブラリを使用することはできますが、所有者である自分自身がメッセージを復号化してプライバシーを侵害する可能性を排除する方法で使用するにはどうすればよいでしょうか。

もちろん、私は決してこれをしません。私はこの程度のプライバシーを証明したいと思います。パスワードで暗号化すると、パスワードがわかります。プログラムによるパスワードで暗号化すると、PHPがパスワードをどこに保存するかがわかります。

これを解決する方法はありますか?それとも、これは信頼で終わるのでしょうか?

更新: PHPがステートレスであることを私が知っている限り、たとえばセッションはサーバーにデータをメモリに保存するように強制します、これはキー/パスワードをメモリに保存するための解決策でしょうか?

アイデアやアドバイスをありがとう。

4

2 に答える 2

2

このタイプの問題を解決する一般的な方法は、公開鍵暗号化を使用することです。概要については、http://en.wikipedia.org/wiki/Public-key_cryptographyを参照してください。

一言で言えば、すべてのユーザーに公開鍵と秘密鍵の組み合わせが発行されます。公開鍵は公開されているため、誰の公開鍵も取得できます。秘密鍵は、それが属するユーザーによってのみ保持されます。公開鍵暗号化の鍵は、公開鍵を使用して何かを暗号化できるようにする数学ですが、秘密鍵でのみ復号化することができます。したがって、誰かの公開鍵を取得し、その人宛てのメッセージを暗号化することができます。秘密鍵でそれを復号化できるのは、その人だけです。

スキームでは、公開鍵をサーバーに保持し、クライアントから要求することができます。公開鍵は誰でも利用できます。ブラウザのみの環境では、秘密鍵を保存するのは困難です。ローカルストレージに保存することもできますが、その場合はその特定のコンピューターからのみ使用できます。サーバーに保存して、ユーザーがどこにいても秘密鍵を取得できるようにすると、元々の問題と同じ問題に戻ります(サーバーとサーバーの作成者を信頼する必要があります)。秘密鍵自体にアクセスしない)。

公開鍵/秘密鍵を(おそらくローカルストレージに)キャッシュしようとするより複雑なアルゴリズムがありますが、それが利用できなくなったときはいつでも(ユーザーがコンピューターを切り替えるときなど)、新しいものを作成してローカルに保存し、新しい公開鍵でディレクトリを更新します。これには、新しいコンピューターからシステムを引き続き使用できるという利点がありますが、以前の公開鍵で暗号化されたメッセージを、その公開鍵に対応する秘密鍵を何らかの方法で持っていない限り読み取ることができないという欠点があります。したがって、これは、メッセージがサーバーに保存されないライブインスタントメッセージングシナリオでは機能する可能性がありますが、サーバーがメッセージを保持していて、それぞれが独自の場所からメッセージを読み取ることができると期待される場合は機能しません。キーペア。

SSLは、動的に生成された公開鍵と秘密鍵のペアを使用してこの問題を解決しますが、直接のエンドツーエンド接続でネゴシエートおよび交換されるため(したがって、暗号化されていないデータを表示または保存するノードは途中にありません)、別の可能性がありますピアツーピアゲームテクノロジー(独自のワートがあり、ブラウザーだけでは不可能な場合があります)を使用してピアツーピア接続を作成し、その接続を介してSSLを使用してセキュリティ資格情報を交換します(外部あなたとあなたのサーバーのビュー)またはメッセージを直接交換するだけです。サーバーは、2つのエンドポイントの接続とその要望の伝達を容易にするために使用されますが、セキュリティ情報の交換には使用されません。

于 2012-09-08T15:21:56.217 に答える
1

クライアントで暗号化を行うことができます。最大限のプライバシーが必要な場合は、サーバー上の何も信頼しません。メッセージや復号化キーがサーバーにヒットしない場合は、誘惑されたとしても、基本的にメッセージを読み取ることはできません。

もちろん、新しい問題が発生しました。サーバーを使用せずに、2つ以上のクライアント間で復号化キーを交換する方法です。

于 2012-09-08T13:09:32.093 に答える