2011-01-05 1 views
17

または:複数のユーザーのために暗号化されたデータを保存するにはどうすればよいですか?複数の秘密鍵(PHP)で暗号化することはできますか?

私が認めているのは、愚かな質問です。秘密鍵は、その用語がすでに暗示しているように、1人に制限されています。しかし、私は次のシナリオを持っています:

ユーザーTomは、データベースに暗号化されて保存する必要があるデータを入力します。ユーザは、この情報をJimとBobに利用可能にしたいと決定します。ユーザーJohnとJayneはそれを解読できないはずです。もちろん、サーバーをハッキングし、暗号化されたデータと暗号化/復号化を行うスクリプトにアクセスできるユーザーのTimにも当てはまらない。

PHPを使用した公開鍵/秘密鍵のアプローチは、2人のユーザーがデータを復号化するためにその "プライベート"キーを持つ必要があるため、ここでは機能しません。

これはかなり一般的な質問ですが、重要なのであれば、PHP(とMySQLの多分)で行う必要があります。

答えて

14

これは、OpenPGP(および他のシステム)で行われた方法です: - データ自体を暗号化するために使用される秘密の対称鍵を生成しています。 - この対称鍵はTomの鍵で暗号化されています。 - また、対称鍵はJimとBobの公開鍵で暗号化することができ、鍵の解読を許可し、その後でデータを解読することができます。

+0

ありがとうございます - 他の人が同じことを基本的にお勧めし、あなたが最初であったので、これを受け入れられた回答として選択します。皆さん、ありがとうございました! – acme

3

PHPのライブラリは分かりません。次のようにしかし、一般的に手順は次のとおりです。

  • データは、各受信者に対して対称鍵
  • を使用して暗号化され、鍵が
  • はこのすべては、PKCS#7に保存されている受信者の公開鍵を使って暗号化されていますファイル構造

「PHPとPKCS7」を検索するとき

+0

PHPの 'openssl_seal()'関数はこれを実行します(ただし、PKCS#7出力は生成されません)。 – caf

2

はトムのキーと区別だデータ暗号化キーを(Kgeneralそれを呼び出す)を使用します...いくつかの結果があるはずです。

Tomの公開鍵を使ってKgeneralを暗号化し、結果をTomに与えます。秘密鍵を使用して解読し、Kgeneralを得ることができます。

別のユーザーがデータにアクセスする必要がある場合、Tom(またはアプリケーション)はKgeneralを公開鍵で暗号化し、その方法でアクセスできます。

11

PHPはこれに対応して - openssl_seal()を提供します。この関数は、公開鍵の配列をとり、対応する秘密鍵のいずれかを使用して解読することができるようにデータを暗号化します(openssl_open()を使用)。

+0

私はこの関数が受信者の公開鍵の配列をとることを理解しますが、送信者の秘密鍵と公開鍵はどうですか?この関数はランダムなものを生成し、送信者のpubkeyをsealed_dataに埋め込みますか? –

+0

@DawidGrzesiak: 'openssl_seal()'関数はデータに署名しないので、送信者のキーは必要ありません。 [openssl_sign() '](http://php.net/openssl_sign)を使って' openssl_seal() 'の結果に署名することができます。 – caf

関連する問題