Как лучше хранить "секретную" инфу в базе
Другой пользователь может читать или расшаренную с ним информацию или свою. И хотелось бы иметь только одну копию шифрованной информации. Но похоже так не получится.
...
Если стащили один ключ, то тогда разрешено прочитать только ту информацию которая связана с именно с этим ключом/пользователем.
Есть ресурсы и есть пользователи. У пользователя есть ключ для шифрования (КП - ключ пользователя). Пользователь хочет сохранить где-то у нас данные (ресурс). В зашифрованном виде. Чо делать?
Создаём для пользователя новый ключ шифрования - ключ ресурса (КР). Шифруем данные КР и храним их (ЗР зашифрованный ресурс). Шифруем КР с помощью КП = ЗКР. Храним ЗКР.
Мысль понятна? У каждого ресурса свой КР. Если пользователь А (с ключом КПа), владеющий ресурсом Р1 (с ключом КР1) хочет поделиться им с пользователем Б (КПб), а копировать; содержимое мы не хотим, создаём ЗКР1б из КР1 (КР1 зашифрованный КПб) и делимся им с Б. Б хочет прочитать Р1? Да пожалста. Ввёл свой ключ, прочитал ЗКР1, расшифровал, получил КР1, расшифровал им ресурс.
Используем мы симметричные или асимметричные ключи - не принципиально.
Итого. Мы, не зная ключей пользователей, ничего прочитать не можем, хоть всё и храним. Ресурсы не копируются. Настройка доступа пользователя (или групп) происходит через управление ЗКР. Если пользователь про...теряет свой ключ, он потеряет доступ к данным. Совсем.
Домашнее задание: что делать, если надо отозвать право доступа к ресурсу Р2 у пользователя В? Пользователи А и Б тоже имеют доступ к ресурсу.
П.С. Да, при доступе к системе пользователя мы, конечно, сможем выловить расшифрованные ключи из памяти. Ну так он и так свой ключ знает...