Или: как хранить зашифрованные данные для группы пользователей?
Я признаю, что это глупый вопрос, закрытый ключ ограничен только одним человеком, как предполагает этот термин. Но у меня есть следующий сценарий:
Пользователь Tom вводит данные, которые необходимо хранить в зашифрованном виде в базе данных. Пользователь решает, что хочет предоставить эту информацию Джим и Бобу. Пользователи John и Jayne не должны расшифровывать их. Конечно, также не пользователю Тиму, который взломал сервер и получил доступ к зашифрованным данным и скриптам, которые выполняют шифрование / дешифрование.
Я думаю, что подход с открытым ключом / частным ключом с PHPs openssl_public_encrypt не будет работать здесь, поскольку двум пользователям нужен этот «закрытый» ключ для дешифрования данных.
Я предполагаю, что это довольно общий вопрос, но если это важно, это должно быть сделано в PHP (возможно, MySQL).
Вот как это делается в OpenPGP (и других системах): – вы генерируете секретный симметричный ключ, который используется для шифрования самих данных; – тогда этот симметричный ключ зашифрован ключом Тома; – также симметричный ключ может быть зашифрован с открытым ключом Джима и Боба, что позволяет им расшифровывать ключ, а затем расшифровывать данные
PHP предоставляет функцию для этого – openssl_seal()
. Эта функция принимает массив открытых ключей и шифрует данные, чтобы любой из соответствующих закрытых ключей можно было использовать для дешифрования (с помощью openssl_open()
).
Я не знаю библиотеки на PHP. Но в целом процедура такова:
Должны быть некоторые результаты при поиске «PHP и PKCS7» …
Используйте ключ шифрования данных (назовите его Kgeneral), который отличается от ключа Тома.
Зашифруйте Kgeneral с открытым ключом Тома и дайте результат Тому – он может использовать свой закрытый ключ, чтобы расшифровать его и получить Kgeneral.
Если другому пользователю нужен доступ к данным, Tom (или ваше приложение) может затем шифровать Kgeneral своим открытым ключом и предоставить ему доступ таким образом.