Мы разрабатываем веб-приложение, в котором пользователи могут обмениваться документами друг с другом. Конечная цель — добиться нулевого доверия, необходимого пользователям, т. е. шифрование на стороне клиента гарантирует, что серверы (или любые посредники) не смогут увидеть данные в открытом виде. (Я знаю о потенциальных недостатках решения для шифрования на основе браузера. У нас есть идеи, как противостоять некоторым проблемам, я могу задать их здесь позже, но я не хочу загрязнять этот вопрос.)
Базовая схема нулевого доверия будет выглядеть так:
- Если пользователь регистрируется (через OAuth2), его браузер генерирует случайную парольную фразу из 32 символов base-62.
- Эта парольная фраза используется для получения открытого/закрытого ключа с помощью PBKDF2.
- Открытый ключ отправляется на сервер, пользователю предлагается случайная парольная фраза, сгенерированная под 1., чтобы он мог ее записать.
- Мы генерируем случайный ключ для каждого документа, шифруем его открытыми ключами всех участников и сохраняем вместе с документом.
Закрытый ключ и начальная случайная фраза-пароль (1.) никогда не покидают клиент, поэтому нет возможности расшифровать данные на стороне сервера.
НО: это не очень удобно для конечного пользователя. Если они потеряют ключ (а они наверняка потеряют), то у них не будет доступа ни к одному из их документов. Если они входят в систему на другом устройстве, они должны ввести парольную фразу. Мы имеем дело с очень разнообразной группой пользователей, и большинство из них совсем не «технически подкованы», да и не должны быть таковыми.
Существуют решения BYOK, подобные тем, которые используют СПП Google Workspace. Но AFAICS пользователь должен будет пройти аутентификацию в другом сервисе, чтобы использовать наш сервис. Это тоже не удобно и, возможно, просто непонятно нашим пользователям.
Учитывая, что мы контролируем аутентификацию — она обеспечивается Auth0 — можем ли мы каким-либо образом хранить закрытый ключ пользователя где угодно (даже у третьих лиц) без необходимости двойной аутентификации пользователя?
Кроме того, мы рассматриваем режим, который мы называем «мягким» режимом, в котором мы храним закрытый ключ от имени пользователя, используя совершенно отдельную инфраструктуру, используя HSM. Это, конечно, нарушит принцип нулевого доверия, но, по крайней мере, защитит от утечки данных при утечке зашифрованных документов. Пользователи всегда могут выбрать «жесткий» режим. (Существует проблема, если документ используется совместно пользователем, использующим «жесткий» режим, и пользователем, использующим «мягкий» режим, в основном нарушая обещание, данное пользователю, использующему «жесткий» режим. опционально разрешите пользователю установить, что все участники должны использовать «жесткий» режим.)
Имеет ли это смысл? Есть ли какие-либо указания для дальнейшего чтения? Пожалуйста, извините меня, если я не смог быть кратким или достаточно ясным.