Внедрение шифрования конвертов на Android с помощью Tink и Google Cloud KMS

Приложение, которое я реализую, будет содержать очень конфиденциальные пользовательские данные, и поэтому мы хотим зашифровать данные перед их сохранением как локально, так и онлайн (в Gcloud Firestore). Я хочу сделать это с помощью Envelope Encryption.

В настоящее время у меня есть серверная часть Python, развернутая в Gcloud Run, которая имеет учетные данные для подключения к GCloud KMS. Он предлагает REST API, который я хочу использовать для шифрования ключа шифрования данных (DEK) с использованием ключа GCloud KMS в качестве ключа шифрования ключа (KEK). В настоящее время он может шифровать только простые строки, если я делаю это из отдельной серверной части, а не из самого приложения, потому что, насколько я знаю, нет безопасного способа хранить учетные данные GCloud внутри приложения. Клиентская библиотека GCloud KMS не поддерживает Android. Еще один ответ SO касается при этом.

На стороне Android я использую Tink для создания Ключ шифрования данных, и я могу зашифровать с его помощью свои данные. Последний шаг, который я не могу полностью понять, — это то, как я могу отправить ключ AEAD на свой сервер. Это то, что я уже рассмотрел:

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

  • Я мог бы использовать JSONKeyWriter для записать JSON-версию ключа в строку с помощью ByteArrayOutputStream и отправить эту строку для шифрования с помощью моего внутреннего интерфейса, но по какой-то причине я пока не могу объяснить, что мне это не кажется правильным.

Так что я немного застрял. Второй вариант все еще правильный? Может быть, есть еще третий вариант, который я еще не рассматривал. Я не думаю, что я первый, кто реализовал это, но я не могу найти никакой информации о том, как работать таким образом.


person HDW    schedule 07.01.2020    source источник
comment
Можете ли вы уточнить (1) где будут храниться фактические зашифрованные данные, (2) где будет храниться упакованный DEK и где (3) где вы хотите иметь возможность развернуть объект и увидеть расшифрованные данные? У меня есть пара возможных предложений в зависимости от того, что вы действительно пытаетесь сделать.   -  person Tim Dierks    schedule 07.01.2020
comment
@TimDierks (1) Я храню события, которые состоят из некоторых метаданных вместе с некоторыми двоичными файлами. Зашифрованные метаданные будут храниться в FireBase, а зашифрованные файлы — в Firestore. (2) Обернутый DEK будет храниться вместе с метаданными. (3) Я хочу расшифровать объекты в своем приложении для Android. Основная цель состоит в том, что никто, кроме пользователя, не может видеть его данные, но есть несколько пользователей в одном приложении на одном планшете.   -  person HDW    schedule 08.01.2020
comment
Привет HDW, прежде чем обсуждать возможные решения, я хотел бы больше понять вашу цель. Если в одном приложении есть несколько пользователей, я полагаю, что приложение должно иметь какой-то способ аутентификации пользователей, верно? После аутентификации вы узнаете личность пользователя, и из этого вы можете убедиться, что он может видеть только свои файлы. Я не уверен, зачем нужно шифрование. Это потому, что вы хотите создавать резервные копии файлов в облаке?   -  person Thai Duong    schedule 14.02.2020
comment
StackOverflow не позволяет мне редактировать свой комментарий. В целом, я хочу понять требования, то есть какие функции предлагает ваше приложение и какие гарантии безопасности/конфиденциальности вы хотите предоставить своим пользователям. Пожалуйста, напишите мне по адресу [email protected], если вы хотите поделиться этой информацией в частном порядке. Мы также можем общаться по телефону или в Hangouts.   -  person Thai Duong    schedule 14.02.2020
comment
Есть новости по этому поводу? я застрял на той же проблеме :/   -  person Ebenezer Isaac    schedule 13.07.2021
comment
@EbenezerIsaac Я связался с тайцем по почте, и оказалось, что шифрование конверта для моего варианта использования, вероятно, не подходит. Однако в итоге я использовал свое второе предложение, JSONKeyWriter. Однако я не могу гарантировать, насколько это безопасно.   -  person HDW    schedule 03.08.2021