Возможно ли иметь шифрование с несколькими закрытыми ключами (PHP)?

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

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

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

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

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

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

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

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

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

Должны быть некоторые результаты при поиске «PHP и PKCS7» …

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

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

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