Возможно ли иметь шифрование с несколькими закрытыми ключами (PHP)?
Или: как хранить зашифрованные данные для группы пользователей?
Я признаю, что это глупый вопрос, закрытый ключ ограничен только одним человеком, как предполагает этот термин. Но у меня есть следующий сценарий:
Пользователь Tom вводит данные, которые необходимо хранить в зашифрованном виде в базе данных. Пользователь решает, что хочет предоставить эту информацию Джим и Бобу. Пользователи John и Jayne не должны расшифровывать их. Конечно, также не пользователю Тиму, который взломал сервер и получил доступ к зашифрованным данным и скриптам, которые выполняют шифрование/дешифрование.
Я думаю, что подход с открытым ключом/приватным ключом с PHP openssl_public_encrypt не будет работать здесь, поскольку двум пользователям необходимо иметь этот "private" ключ для дешифрования данных.
Я предполагаю, что это довольно общий вопрос, но если это важно, это должно быть сделано в PHP (возможно, MySQL).
Ответы
Ответ 1
Как это делается в OpenPGP (и других системах):
- вы генерируете секретный симметричный ключ, который используется для шифрования самих данных;
- тогда этот симметричный ключ зашифрован с помощью ключа Tom;
- также симметричный ключ может быть зашифрован с открытым ключом Джима и Боба, что позволяет им расшифровывать ключ, а затем расшифровывать данные
Ответ 2
PHP предоставляет функцию для этого - openssl_seal()
. Эта функция принимает массив открытых ключей и шифрует данные, чтобы любой из соответствующих закрытых ключей можно было использовать для дешифрования (используя openssl_open()
).
Ответ 3
Я не знаю библиотеки на PHP. Но в целом процедура такова:
- Данные шифруются с использованием симметричного ключа
- Для каждого получателя ключ шифруется с использованием открытого ключа получателя
- Все это сохраняется в структуре файла PKCS # 7.
Должны быть некоторые результаты при поиске "PHP и PKCS7"...
Ответ 4
Используйте ключ шифрования данных (назовите его Kgeneral), который отличается от ключа Tom.
Зашифруйте Kgeneral с открытым ключом Tom и дайте результат Tom - он может использовать свой закрытый ключ для его расшифровки и получения Kgeneral.
Если другому пользователю нужен доступ к данным, Tom (или ваше приложение) может затем шифровать Kgeneral своим открытым ключом и предоставлять ему доступ таким образом.