Возможно ли иметь шифрование с несколькими закрытыми ключами (PHP)? - PullRequest
18 голосов
/ 05 января 2011

Или: Как хранить зашифрованные данные для группы пользователей?

Признаюсь, это глупый вопрос, личный ключ ограничен только одним человеком, как уже подразумевается в этом термине. Но у меня есть следующий сценарий:

Пользователь Том вводит данные, которые должны храниться в зашифрованном виде в базе данных. Пользователь решает, что хочет сделать эту информацию доступной для Джима и Боба. Пользователи Джон и Джейн не должны иметь возможность расшифровать его. Конечно, также не пользователю Тим, который взломал сервер и имеет доступ к зашифрованным данным и сценариям, которые выполняют шифрование / дешифрование.

Я думаю, что подход с открытым ключом / закрытым ключом с помощью PHP openssl_public_encrypt здесь не сработает, так как два пользователя должны иметь этот "закрытый" ключ для расшифровки данных.

Полагаю, это довольно общий вопрос, но, если он важен, это должно быть сделано на PHP (и, возможно, MySQL).

Ответы [ 4 ]

14 голосов
/ 05 января 2011

Вот как это делается в OpenPGP (и других системах): - вы генерируете секретный симметричный ключ, который используется для шифрования самих данных; - затем этот симметричный ключ шифруется ключом Тома; - также симметричный ключ может быть зашифрован с помощью открытого ключа Джима и Боба, что позволяет им расшифровывать ключ и после этого дешифровать данные

11 голосов
/ 06 января 2011

PHP предоставляет функцию для этого - openssl_seal(). Эта функция принимает массив открытых ключей и шифрует данные, чтобы любой из соответствующих закрытых ключей можно было использовать для его расшифровки (используя openssl_open()).

3 голосов
/ 05 января 2011

Я не знаю библиотек в PHP.Но в целом процедура выглядит следующим образом:

  • Данные шифруются с использованием симметричного ключа
  • Для каждого получателя ключ шифруется с использованием открытого ключа получателя
  • Все это сохраняется в файловой структуре PKCS # 7

При поиске "PHP and PKCS7" должны быть некоторые результаты ...

2 голосов
/ 05 января 2011

Используйте ключ шифрования данных (назовите его Kgeneral), который отличается от ключа Тома.

Зашифруйте Kgeneral с помощью открытого ключа Тома и передайте результат Тому - он может использовать свой закрытый ключ для его расшифровки и получить Kgeneral.

Если другому пользователю затем необходим доступ к данным, Том (или ваше приложение) может затем зашифровать Kgeneral с помощью своего открытого ключа и предоставить ему доступ таким образом.

...