Как хранить личные зашифрованные пользовательские данные в базе данных, но сделать их доступными для других выбранных пользователей?
Во -первых, я прошу прощения, если мой вопрос звучит немного запутанно, я постараюсь описать мой сценарий как можно более подробно:
У меня есть сайт, где пользователь может ввести свои личные данные о себе. В основном это данные о состоянии здоровья, поэтому это очень конфиденциальная и конфиденциальная информация. Поэтому мне нужно зашифровать эти данные на сервере, даже если сервер скомпрометирован, эти данные защищены, поскольку они будут зашифрованы паролем каждого пользователя. Конечно, пароли пользователей не будут храниться на сервере в виде открытого текста, только хэши паролей.
Но моя проблема в том, что веб-сайт будет предлагать "социальную функцию", когда пользователь может поделиться своей информацией с другим пользователем. Но это будет проблемой, потому что у меня не будет никакого способа расшифровать личные данные пользователя, и поэтому я не могу показать их другому пользователю.
Можете ли вы дать мне несколько вариантов или хотя бы идеи, как это можно решить? Предпочтительно использование среды LAMP.
1 ответ
Это можно решить с помощью криптографии с открытым ключом:
- Генерация пары открытый / закрытый ключ для каждого пользователя; и только когда-либо дешифровать закрытый ключ временно с паролем пользователя.
- Для каждого элемента данных случайным образом выберите (симметричный) ключ S и зашифруйте данные d с его помощью. Хранить S (d).
- Зашифруйте S с помощью открытого ключа P + u пользователя, которому вы хотите предоставить доступ. Изначально это пользователь, чьи данные вы храните.
- Храните P + u (S) постоянно. Забудьте все остальные ключи.
Теперь, когда пользователь хочет поделиться данными с пользователем x, сделайте следующее:
- Расшифруйте личный ключ пользователя P - u с помощью пароля пользователя.
- Используя этот закрытый ключ, расшифруйте сохраненные данные: P - u (P + u (S)) = S.
- Зашифруйте S открытым ключом пользователя, которому вы хотите поделиться информацией.
- Сохраните полученный P + x (S) постоянно. Забудьте все остальные ключи.
Теперь, когда любой пользователь x хочет получить доступ к данным, выполните следующий процесс:
- Расшифруйте личный ключ пользователя P - x с помощью пароля пользователя.
- Найдите P + x (S). (Если он не сохранен, это означает, что никто не поделился данными с плохим пользователем x).
- Используя закрытый ключ, расшифруйте сохраненные данные: P - x (P + x (S)) = S.
- Используя S, расшифруйте сохраненный зашифрованный S(d): S(S(d)) = d.