Шифрование на стороне клиента (CSE) гарантирует, что ваши данные будут зашифрованы до того, как достигнут серверов Google Drive, предоставляя вам контроль над вашими данными. Это руководство описывает процесс программного шифрования и загрузки, а также скачивания и расшифровки файлов CSE с использованием API Google Drive. В нем также рассматриваются рекомендуемые подходы к тестированию и проверке вашей реализации.
Прежде чем начать
Прежде чем работать с зашифрованными файлами, настройте домен Google Workspace, используя следующий контрольный список:
Настройте шифрование на стороне клиента (CSE) для вашего домена.
Настройте своего поставщика идентификационных данных (IdP) .
Убедитесь, что ваша служба списков контроля доступа по ключу (KACLS) поддерживает конечные точки
/wrap,/unwrap,/privilegedwrap,/privilegedunwrapи/digest.Создайте проект в консоли Google Cloud и включите API Google Drive .
Аутентификация и авторизация
Для взаимодействия с API Google Drive и вашими KACLS необходимо выбрать метод аутентификации. Этот выбор влияет на то, как вы будете взаимодействовать с обеими службами:
- Для аутентификации в качестве физического лица используйте поток OAuth , действующий от имени этого пользователя. Используйте стандартные конечные точки
/wrapи/unwrapи предоставьте токен авторизации Google для этого пользователя. - Администратор: Чтобы выдавать себя за других пользователей в домене, используйте учетную запись службы с делегированием полномочий в масштабе домена (DWD). Используйте конечные точки
/privilegedwrapи/privilegedunwrapбез токена авторизации Google.
Дополнительные сведения о создании учетных данных см. в руководстве по созданию учетных данных доступа .
Аутентификация поставщика идентификации домена
Для аутентификации с вашим поставщиком идентификации (IdP) необходимо настроить идентификатор клиента OAuth и загрузить файл секретного ключа клиента. Ваше приложение должно получить токен аутентификации от вашего IdP для аутентификации запросов к вашим KACLS. Этот токен необходим для предоставления вашему приложению доступа к ключу шифрования данных .
Обеспечьте безопасную обработку учетных данных.
Ваше приложение обрабатывает конфиденциальные учетные данные для аутентификации в API Google Drive и вашем поставщике идентификации (IdP). К ним относятся:
- Секретные материалы от поставщика идентификации, такие как файл с секретной информацией клиента.
- Секретные материалы от Google, такие как файл закрытого ключа учетной записи службы.
- Секретные данные, хранящиеся в приложении, такие как сохраненные учетные данные.
Вы должны обеспечить безопасное хранение всех этих учетных данных.
Ограничения и квоты
На файлы, зашифрованные на стороне клиента, распространяются стандартные ограничения и квоты Google Диска. Обратите внимание на ограничения общего доступа к дискам , общие ограничения на файлы и папки , а также на то, как управлять своей квотой . Кроме того, ваш инструмент импорта должен учитывать ограничения скорости, установленные вашей службой списков контроля доступа по ключу (KACLS) и вашим поставщиком идентификационных данных (IdP).
Структура зашифрованного файла
Для загрузки и скачивания Google Drive ожидает следующий формат файлов, зашифрованных на стороне клиента.
+-------------------+
| Magic header |
+-------------------+
| Encrypted Chunk 1 |
+-------------------+
| Encrypted Chunk 2 |
+-------------------+
| ... |
+-------------------+
| Encrypted Chunk N |
+-------------------+
Волшебный заголовок
Магический заголовок (также известный как сигнатура файла или магическое число) — это постоянная последовательность байтов, размещаемая в самом начале файла для уникальной идентификации его формата. Файл должен начинаться с байтов 0x99 0x5E 0xCC 0x5E .
Зашифрованные фрагменты
Файл необходимо разбить на фрагменты размером 2 МиБ. Каждый фрагмент шифруется с использованием примитива Authenticated Encryption with Associated Data (AEAD) из библиотеки Google Tink с ключом типа AES-GCM, используя индекс фрагмента и флаг конечного фрагмента в качестве ассоциированных данных. Пример кода, использующего API Google Drive и соответствующего данной спецификации, см. в демонстрационном примере с открытым исходным кодом .
Зашифровать и загрузить файл
Для загрузки файла CSE ваше приложение должно пройти аутентификацию, запросить токен CSE, зашифровать содержимое файла локально, упаковать ключ шифрования и, наконец, загрузить зашифрованное содержимое и метаданные в Google Диск.
Получите токен CSE
Запросите токен CSE у Google Drive, вызвав метод Files:generateCseToken API Drive. Убедитесь, что вы не включаете параметр запроса fileId в запрос. Чтобы создать файл в определенной папке, включите параметр запроса parent с идентификатором папки. Если parent опущен, файл будет создан в корневой папке «Мой диск» пользователя. В ответе будет содержаться уникальный идентификатор файла для загрузки и токен авторизации JWT, необходимый для этапа обертывания ключа.
Шифрование данных локально
- Используйте Google Tink для генерации уникального ключа шифрования данных (DEK) для файла.
- Зашифруйте содержимое файла в соответствии со структурой зашифрованного файла .
Хэш ключа вычислительного ресурса
Для вычисления хеша ключа ресурса:
- Извлеките
resource_nameиperimeter_idиз токена авторизацииjwt, полученного отgenerateCseToken. Еслиperimeter_idотсутствует, используйте пустую строку. - Вычислите HMAC-SHA256, используя открытый текст DEK в качестве ключа и строку
ResourceKeyDigest:my_resource_name:my_perimeter_idв качестве данных для подписи. - Закодируйте полученный хеш в формате Base64.
Для получения более подробной информации см. Хэш ключа ресурса .
Оберните ключ шифрования
Для защиты DEK зашифруйте (упакуйте) его с помощью внешних KACLS.
- Вызовите соответствующую конечную точку:
- Индивидуальный:
/wrap - Администратор:
/privilegedwrap
- Индивидуальный:
- Передайте открытый DEK, токен аутентификации вашего поставщика идентификации (IdP), токен авторизации Google (если требуется),
resource_nameиз JWT иreason. - Получите упакованный DEK (WDEK) от KACLS.
Загрузить на Диск
Используйте конечную точку files.create API Google Drive для стандартной загрузки зашифрованного файла. Задайте следующие поля в метаданных файла:
-
id: Уникальный идентификатор файла, полученный из ответаgenerateCseToken. -
mimeType:application/vnd.google-gsuite.encrypted; content="application/octet-stream".- Параметр
contentможет быть установлен на MIME-тип исходного файла.
- Параметр
-
clientEncryptionDetails:-
encryptionState:"encrypted". -
decryptionMetadata:-
wrappedKey: Обернутый DEK (WDEK), полученный от KACLS. -
kaclsId: Идентификатор KACLS, полученный из ответаgenerateCseToken. -
keyFormat:"tinkAesGcmKey". -
aes256GcmChunkSize:"default". -
encryptionResourceKeyHash: Хэш, вычисленный в Compute Resource Key Hash .
-
-
Пример с открытым исходным кодом
Для практической демонстрации процесса шифрования и загрузки обратитесь к демонстрационному проекту с открытым исходным кодом . Он предоставляет работающее решение и может служить ценным справочным материалом.
Скачать и расшифровать файл
Для загрузки файла CSE необходимо получить зашифрованное содержимое и метаданные с Google Drive, запросить открытый текст DEK у вашего KACLS и расшифровать файл локально.
Получение метаданных файла и зашифрованного содержимого.
Вызовите метод Files:get API Google Drive, чтобы получить метаданные и содержимое файла. Объект clientEncryptionDetails содержит DecryptionMetadata , включающую Wrapped DEK (WDEK) и JWT, содержащий информацию KACLS.
Расшифруйте ключ шифрования
- Вызовите соответствующую конечную точку:
- Индивидуальный:
/unwrap - Администратор:
/privilegedunwrap
- Индивидуальный:
- Передайте WDEK, токен аутентификации вашего поставщика идентификации (IdP), токен авторизации Google (если требуется),
resource_name) иreason). - Получите открытый текст DEK от KACLS.
Расшифровать данные локально
- Инициализируйте шифр, используя открытый текст DEK, полученный от KACLS.
- Пропустите начальные «магические байты» и расшифруйте оставшееся содержимое в соответствии со структурой зашифрованного файла .
Пример с открытым исходным кодом
Для практической демонстрации процесса загрузки и расшифровки обратитесь к демонстрационному проекту с открытым исходным кодом . Он предоставляет работающее решение и может служить ценным справочным материалом.
Проверьте импортированные файлы
Поскольку у Google нет доступа к ключам шифрования, компания не может расшифровать и проверить ваши файлы на стороне сервера. Ошибки реализации на этапах локального шифрования или упаковки ключей приведут к ошибкам при расшифровке файлов на стороне клиента. Тщательная проверка крайне важна перед использованием собственной реализации.
Для корректной работы загруженного контента Google Drive CSE необходимо, чтобы он был должным образом зашифрован и содержал корректные метаданные. Вы несете ответственность за обеспечение достоверности контента и возможности его расшифровки.
Выполните тесты шифрования и дешифрования в обоих направлениях.
Для проверки вашей реализации крайне важно протестировать весь процесс от начала до конца. Это включает в себя создание набора тестовых файлов, их шифрование с использованием вашей локальной логики, загрузку на Google Диск с помощью API, а затем скачивание и расшифровку. После расшифровки сравните полученное содержимое с исходными файлами, чтобы убедиться в их идентичности. Этот процесс помогает выявить любые проблемы в шифровании, упаковке ключей или обработке метаданных. Демонстрационный пример с открытым исходным кодом показывает, как вы можете реализовать подобный процесс проверки в своем собственном приложении.
Выборочная проверка с помощью Google Drive
Убедитесь, что загруженные файлы содержат значок замка в веб-клиенте Google Диска. Вручную загрузите небольшое количество загруженных файлов, чтобы убедиться, что они работают должным образом. Эта проверка использует реализацию CSE от Google для попытки расшифровки, что помогает выявить проблемы в вашей логике шифрования или обертывания ключа. Включите файлы как из «Моего диска» , так и из общих дисков .
Демонстрация с открытым исходным кодом
Пакет Drive CSE Upload с открытым исходным кодом предоставляет полную, работающую библиотеку Python и пример командной строки, реализующие процессы загрузки и скачивания CSE, описанные в этом руководстве. Настоятельно рекомендуется ознакомиться с демонстрационным кодом, прежде чем создавать собственную интеграцию с CSE.