Разный ключ шифрования для каждого клиента - PullRequest
0 голосов
/ 18 июня 2020

У моего приложения одна схема PostgreSQL, которая содержит все данные всех арендаторов. Требование для определенного клиента c состоит в том, что его данные должны быть зашифрованы и должны использовать отдельный ключ шифрования от всех других клиентов.

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

Я использую Spring Boot с Spring Data JPA (Hibernate) и PostgreSQL. То, что я рассмотрел до сих пор:

AttributeConverter:

Это позволяет мне зашифровать / расшифровать значение в самом приложении и работает довольно хорошо. Просто добавьте аннотацию @Convert к столбцам, которые я хочу зашифровать.

Негативным аспектом здесь является то, что я не думаю, что могу четко просматривать расшифрованные данные при запросе базы данных с помощью инструмента SQL, он должен пройти через Hibernate, чтобы его можно было прочитать. Причина, по которой я считаю это отрицательным, заключается в том, что компании, для которой я это создаю, может потребоваться административное представление обо всех клиентах и ​​их данных, которые могут быть созданы с помощью PowerBI, Google Data Studio, ...

ColumnTransformer:

Аннотация @ColumnTransformer атрибута сущности, которая затем использует функции pgp_sym_encrypt и pgp_sym_decrypt расширения pgcrypto.

Это решает отрицательный аспект, прежде чем увидеть, как он использует расширение pgcrypto, поэтому я все еще могу запрашивать базу данных с помощью инструмента SQL.

-

Для «динамической» установки ключ, я подумал, что буду использовать что-то вроде класса ThreadLocal, который будет извлекать ключ из хранилища, используя свойство tenantId аутентифицированного пользователя. Однако это представляет новую проблему. Некоторые из моих доменных сущностей регистрируют доменные события, которые обрабатываются асинхронно, что означает, что они будут выполняться в другом потоке. У этих обработчиков событий не будет доступа к ключу ...

Я не думаю, что могу использовать что-то вроде InheritableThreadLocal, поскольку я использую решение для пула потоков.

Приветствуются любые мысли о том, как решить эту проблему или, по крайней мере, о том, как правильно оценить компромиссы.

...