本主题介绍如何在本地加密数据并将其上传到 Cloud Storage with Tink 和 Cloud Key Management Service (Cloud KMS)。Tink 是由 Google 的密码学家和安全工程师编写的开源加密库。
概览
客户端加密是在将数据发送到云端之前执行的任何加密。使用客户端加密功能时,您需自行创建 在将数据发送到 。
在本主题中,您将使用 Cloud KMS 中的加密密钥通过 Tink 实现客户端信封加密。
您可以在 kms-solutions GitHub 代码库。
准备工作
- 创建对称 Cloud KMS 加密密钥进行加密。乘坐 可以记下密钥的 URI。您后面需要用到它。
- 安装 Tink 以与 Cloud KMS 搭配使用。
- 在 Cloud Storage 中创建存储分区,以上传加密数据。
所需的角色
为确保您的服务账号具有使用 Cloud KMS 密钥与 Tink 搭配使用所需的权限,请让您的管理员为您的服务账号授予密钥的 Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter
) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
您的管理员或许也能将您的服务账号 通过自定义 角色或其他预定义 角色。
使用 Tink 进行信包加密
在信包加密中,Cloud KMS 密钥充当密钥加密密钥 (KEK)。也就是说,该加密密钥可用于加密数据加密密钥 (DEK),而 DEK 则可用于加密实际数据。
在 Cloud KMS 中创建 KEK 后,您必须执行以下操作来加密每条消息:
- 在本地生成数据加密密钥 (DEK)。
- 在本地使用此 DEK 对消息进行加密。
- 使用 Cloud KMS 使用 KEK 加密(封装)DEK。
- 存储加密后的数据和封装后的 DEK。
在下列情况下,您不需要从头开始实施此信封加密过程 使用 Tink
如需使用 Tink 进行信封加密,请为 Tink 提供密钥 URI 和凭据。密钥 URI 指向 Cloud KMS 中的 KEK, 凭据允许 Tink 使用 KEK。Tink 生成 DEK、加密数据、封装 DEK,然后返回包含加密数据和封装 DEK 的单个密文。
Tink 使用带有关联数据的身份验证加密 (AEAD) 原语,支持 Python、Java、C ++ 和 Go 中的信包加密。
连接 Tink 和 Cloud KMS
如需使用 Cloud KMS 中的 KEK 对 Tink 生成的 DEK 进行加密,您需要获取 KEK 的 URI。在 Cloud KMS 中,KEK URI 的格式如下:
gcp-kms://projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
如需详细了解如何获取密钥的路径,请参阅获取 Cloud KMS 资源 ID。
初始化 Tink 并加密数据
Tink 使用基元,即管理细节的加密构建块 因此您可以安全地执行任务。每个 基元提供处理特定任务的 API。在此处,我们使用 AEAD,因此我们使用 Tink AEAD 基元。
Python
Python
如需了解如何安装和使用 Cloud KMS 的客户端库,请参阅 Cloud KMS 客户端库。
如需向 Cloud KMS 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
Java
如需了解如何安装和使用 Cloud KMS 的客户端库,请参阅 Cloud KMS 客户端库。
如需向 Cloud KMS 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
如需详细了解 Tink 支持的基元和接口,请参阅 Tink 的开始使用页面。
后续步骤
- 详细了解 Tink。
- 了解如何将客户端加密与 Cloud SQL 搭配使用。