Как хранить личные зашифрованные пользовательские данные в базе данных, но сделать их доступными для других выбранных пользователей? - PullRequest
9 голосов
/ 23 сентября 2011

во-первых, я прошу прощения, если мой вопрос звучит немного запутанно, я сделаю все возможное, чтобы описать мой сценарий как можно более подробно:

У меня есть веб-сайт, где пользователь может ввести свои личные данные о себе. В основном это данные о состоянии здоровья, поэтому это очень конфиденциальная и конфиденциальная информация. Поэтому мне нужно зашифровать эти данные на сервере, даже если сервер скомпрометирован, эти данные защищены, поскольку они будут зашифрованы паролем каждого пользователя. Конечно, пароли пользователей не будут храниться на сервере в виде открытого текста, только хэши паролей.

Но моя проблема в том, что веб-сайт будет предлагать «социальную функцию», когда пользователь может поделиться некоторыми сведениями с другим пользователем. Но это будет проблемой, потому что у меня не будет никакого способа расшифровать личные данные пользователя, и поэтому я не могу показать их другому пользователю.

Не могли бы вы дать мне несколько вариантов или хотя бы идеи, как это можно решить? Предпочтительно использование среды LAMP.

1 Ответ

22 голосов
/ 23 сентября 2011

Эту проблему можно решить с помощью криптографии с открытым ключом :

  1. Создать пару из открытого / секретного ключей для каждого пользователя;и только когда-либо временно расшифровывать закрытый ключ с помощью пароля пользователя.
  2. Для каждого элемента данных случайным образом выбрать (симметричный) ключ S и зашифровать данные d с помощьюЭто.Сохраните S (d).
  3. Зашифруйте S с помощью открытого ключа P + u пользователя, которому вы хотите предоставить доступ.Изначально это пользователь 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.
...