2011-09-23 13 views
9

私の質問が混乱するようであれば、私はお詫びします。秘密に暗号化されたユーザーデータをデータベースに格納する方法

私は自分の個人情報を入力できるウェブサイトを持っています。主に健康データなので、非常にプライベートで機密情報です。したがって、サーバー上でこのデータを暗号化する必要があります。サーバーが侵害されても、これらのデータは各ユーザーのパスワードで暗号化されるため保護されます。もちろん、ユーザーのパスワードはサーバー上にクリアタイプのテキストとして保存されず、パスワードハッシュだけに保存​​されます。

しかし私の問題は、ユーザーが自分の情報の一部を他のユーザーと共有することを選択できるときに、ウェブサイトが「ソーシャル機能」を提供することです。しかし、これは問題になります。ユーザーの個人情報を復号化する方法がないため、別のユーザーに公開することができないからです。

私にいくつかのオプション、または少なくともアイデアを教えてください。どうすればこの問題を解決できますか? LAMP環境を使用することをお勧めします。

答えて

18

これはpublic-key cryptographyを使用して解決することができます。

  1. 各ユーザーの公開鍵/秘密鍵のペアを生成します。ユーザーのパスワードで秘密鍵を一時的に解読するだけです。
  2. 各データ項目に対して、ランダムに(対称)キーSを選択し、データdを暗号化します。ストアS(d)。
  3. アクセスを許可するユーザーの公開鍵P + uでSを暗号化します。最初は、そのデータを保存しているユーザーuです。
  4. ストアP + u(S)が永続的に格納されます。他のすべてのキーは忘れてください。

今、ユーザーUは、次の手順を実行し、ユーザーのxとデータを共有したい場合:

  1. ユーザの秘密鍵Pを復号化から Uとユーザーのパスワード
  2. 秘密鍵は、保存されたデータを復号化することを使用:Pをから U(P + U(S))= S.
  3. 利用者の公開鍵で暗号化しSます情報を共有したい
  4. 得られたP + x(S)を永続的に保存します。他のすべてのキーは忘れてください。

、任意のユーザーのxは、以下の処理を実行し、データにアクセスすることを望んでいる:

  1. ユーザの秘密鍵のP 解読 - ユーザーのパスワードを Xを。
  2. 検索P + x(S)。 (それが格納されていない場合、誰もそのデータを貧しいユーザーxと共有していないことを意味します)。秘密鍵を使用して
  3. 、格納されたデータを解読する:P から X(P + X(S))= S.
  4. をSを使用して、格納された暗号化されたSを復号(D ):S(S(d))= d。
+1

ありがとうございます。私はそれを完全に消化するために5回読む必要がありましたが、これはまさに私が探していたものです、ありがとう。 – Frodik

+0

@Frodik申し訳ありませんが、私はそれが複雑であることを知っています。そして、すべての変数を除外することでより単純に見えるようにすることができますが、それは非常に不正確になります。ところで、このソリューションを実際に実装するための['openssl'](http://php.net/manual/en/book.openssl.php)モジュールを見てください。 – phihag

+0

もう一度お世話になりました。いくつかの簡単な例やチュートリアルへのリンクを教えてください。そうでなければ、私は確かに自分でGoogleにしようとしますが、私はあなたのポケットに何かがあるかもしれないと思った;-) – Frodik

関連する問題