web-dev-qa-db-ja.com

HTTPS / TLSに加えてエンドツーエンドの暗号化

PHPユーザーが入力したデータを保存するWebアプリケーションを作成する必要があります。これらのデータは、システムの一部の選択したユーザー(作成したユーザーを含む)だけが読み取れるようにする必要があります。データをサーバー管理者または他のバックエンドマネージャーによって復号化されます。データを復号化できるのはエンドユーザーのみです。

HTTPS/TLSがクライアントとサーバー間のデータを安全に暗号化することは知っていますが、ここで必要なのは、一部の選択されたエンドユーザーのみがデータを読み取れるようにすることです。ここでブラウザがコミュニケーションのエンドポイントであることも知っています。研究で私は秘密鍵と公開鍵のペアを使用したエンドツーエンドの暗号化の概念に出くわしたので、私の質問は、これをPHPを使用してWebアプリケーションに実装できるかどうかです。

4
Kiran Muralee

エンドツーエンドの暗号化を使用し、PHP [1]。暗号化部分を「エンド」で実行するもの、つまりブラウザとして実装する必要があるだけなので、現実的にはJavaScriptで実装する必要があります-そしてPHPコードは、このJSをエンドポイントに提供します。PHP=コードは、公開鍵も提供する必要があります。 [2] 暗号化されているデータにアクセスすることになっているすべての人のために。秘密鍵をどのように保存するかに応じて、PHPはおそらく、それらの「ラップされた」(つまり暗号化された)バージョンも保存(および提供)します。

このプロジェクト全体のサーバー側(PHP)の部分は、通常のWebアプリよりも少し複雑になります。ユーザーを認証できる必要がありますが、これは正常ですが、管理者がユーザーを偽装できるようにする必要はありません(これは正常ではありません)。 [3]。おそらく、ユーザーごとのプライベートデータ(ラップされた秘密鍵)、ユーザーごとのパブリックデータ(公開鍵)、およびアクセス制限された共有データ(実際の暗号化されたユーザーデータ)を格納(およびアクセスを制御)できる必要があります)。保存されているデータの種類、データの量、事後的に誰がデータにアクセスできるかを調整できるようにする必要があるかどうか、およびあらゆる種類の検索機能が必要かどうかに応じて、追加の複雑さのホスト。安全なエンドツーエンドシステムはhardです。 [4]

ただし、このことのクライアント側(JS)の部分は、暗号化という面で大きな負担がかかる場所です。 JSは暗号が得意ではないので、これはちょっと厄介です。標準的な暗号関数の純粋なJS実装は存在しますが、問題が発生する傾向があります(比較的遅く、タイミング攻撃などのサイドチャネルの脆弱性を露呈する可能性があります)。一部のブラウザーは、JSからのデータを使用したネイティブ暗号化操作の実行をサポートします。これは、より高速で安全です(ここで必要なブラウザー開発者を信頼している場合)。ただし、まだ普遍的ではありません。


[1]あなたはおそらくすべきではない。 PHPは、セキュリティに非常に敏感なコードには適していません。セキュリティ上のミスを犯すのは比較的簡単です。(modern、full-patched)の安全なコードPHPは確かに可能ですが、Java、C#、VB.NET、またはGoやPythonなど、自分の足を離すことが困難になる言語を使用することをお勧めします。

[2]これは、エンドポイントシステム(ユーザーとそのWebブラウザー)が(データの暗号化先である)クライアントに送信されたかどうかを知る方法がないため、回避策を見つける必要があるセキュリティ上の弱点を示します。 )はright公開鍵です。悪意のあるサーバー管理者が独自の公開キーをキーのリストに追加すると、そのキーのリストで暗号化されたすべてのデータが悪意のある管理者によって読み取られる可能性があります。鍵の信頼性を検証する方法が必要です。

[3]ここで注意が必要な点の1つは、サーバーはユーザーのパスワードを保存してはならないものの、アカウントを作成するとき、およびパスワードを常に参照することです。が使用されている(ログイン、パスワードの変更など)。悪意のあるサーバー管理者がサーバーを変更して、このパスワードを盗む可能性があります。そのユーザーでログインするために必要なのがそのパスワードだけである場合(たとえば、ユーザーのパスワードを知っていることでユーザーの秘密鍵のラップを解除できる場合)、悪意のある管理者は、アクセスするはずのないデータを復号化できます。正当なユーザーになりすまして.

[4] 正直なところ、これは情報セキュリティの経験と開発者の両方の経験を持つ誰かにとってはプロジェクトのように聞こえます。簡単な問題ではなく、暗号化を正しく行うことは困難です。

6
CBHacking

システム管理者がデータを読み取れないようにする必要がある場合、サーバー上で実行されるため、PHPでデータを実装することはできません。

その場合、管理者はいつでもアクセスできるので、秘密キーをサーバーに置くことはできません。

私はあなたの目標を達成するための最良の方法は、ユーザーが入力したキーでブラウザのデータを(JavaScriptを使用して)暗号化/復号化することだと思います。

3
Mark Koek

クライアントアプリケーション(JavaScript)はサーバーによって提供され、サーバー管理者(またはサードパーティのスクリプト)は提供されたスクリプトを簡単に汚染し、クライアント側で生成されたすべての秘密を盗むため、ブラウザーでのエンドツーエンドの暗号化は不可能です。それを回避する方法はありません。エンドツーエンドとは、暗号化されたペイロードを送信するサーバーを含む中央機関を信頼する必要がないことを意味しますが、この場合、サーバーはそれだけです-各ページの読み込み時にクライアントプログラムをユーザーに配布する中央機関、およびユーザーは、クライアントプログラムを汚染しないことを信頼する必要があります。

そのため、信頼できる関係者から独立した、コミュニティでレビューされたコードのソースから構築された個別のクライアントプログラムが必要になります。したがって、E2EアプリをWebアプリにすることはできません。ただし、暗号化されたペイロードを配信するだけのサーバー側の部分は、PHPで実装できます。

1
Calmarius