加密应用数据

本主题介绍一种在通过网络传输数据之前,使用 Cloud Key Management Service 直接在客户端上加密应用数据的方法。

在此示例中,加密的数据会传输到 Google Cloud 并存储在 Cloud Storage 存储桶中。Cloud Storage 还支持使用客户管理的加密密钥自动进行服务器端加密,可使整个过程自动化。如需在向 Google Cloud 传输之前保护应用数据,我们建议您使用 Tink 库

Tink 库是一个多语言跨平台库,可为常见加密任务提供简单且能防止滥用的 API。它可用于在数据进入 Google Cloud 数据存储区之前对数据进行加密,并且支持 Java、Python、C++、Go、Objective-C 和其他语言,以及对象存储和关系型数据库服务。

在本示例中,您将使用 Cloud KMS 来加密文件,然后再将其上传到存储桶。接下来,您下载并解密同一数据,以便在客户端上读取这些数据。

按照这些说明操作时,您的密钥和所有加密操作都会保留在 Google Cloud 中,并且您需要使用 Cloud KMS 进行解密。原始对称加密可让您在本地加密或解密数据,或在不同库和服务提供商之间移动加密数据,而无需先解密数据。

准备工作

在 Google Cloud 组织中,您需要获得权限来创建新项目以及启用结算功能、创建用户以及管理这些项目中的权限。roles/resourcemanager.organizationAdmin 角色可授予此权限。

设置

我们建议使用两个项目和两个用户,以确保职责分离。如果您按照本主题中的步骤操作,则管理加密密钥的用户和服务与使用这些密钥的用户和服务不同。一个项目包含并管理密钥,另一个项目将加密数据存储在 Cloud Storage 存储桶中,并根据需要对数据进行解密。

创建项目

您可以在 Google Cloud 控制台中创建项目。如需查看分步说明,请参阅 Identity and Access Management 快速入门

在组织内:

  1. 创建 Google Cloud 项目以包含用于存储密文的 Cloud Storage 存储桶。这些密钥将作为对象存储在存储桶中。在以下步骤中,此项目称为 my-storage-project

  2. (可选)创建第二个 Google Cloud 项目,以管理用于加密和解密密文的 Cloud KMS 密钥。在下面的步骤中,此项目名为 my-kms-project

    您可以选择为 my-storage-projectmy-kms-project 使用同一 Google Cloud 项目。

  3. 针对每个项目,按照 Cloud KMS 快速入门的准备工作部分中的步骤,来启用 Cloud KMS API 并启用结算功能。

创建用户

您可以在 Google Cloud 控制台中创建用户并向其授予角色。如需查看分步说明,请参阅 Identity and Access Management 快速入门

此过程会创建两个用户。key-admin 管理加密密钥,key-user 可以使用这些密钥加密和解密数据。

my-kms-project 项目中执行此过程。

  1. 创建 key-admin 用户。要创建用户,您需要 my-kms-project 项目的 roles/resourcemanager.organizationAdmin 角色。

  2. key-admin 授予 roles/cloudkms.admin Identity and Access Management 角色。key-admin 可以创建和管理密钥。

  3. 创建 key-user 用户。

  4. 授予 key-user roles/cloudkms.cryptoKeyEncrypterDecrypter IAM 角色。key-user 可以使用密钥来加密和解密数据。

创建存储桶

my-storage-project 项目中执行此过程。

  1. 创建一个存储桶(名为 my-bucket)。
  2. 授予 key-user my-bucket 存储桶的 roles/storage.objectAdmin 角色。

创建加密密钥

my-kms-project 项目中的 key-admin 用户身份执行此过程。

  1. 创建一个名为 storage 的密钥环。密钥环的名称对项目具有唯一性。您无法重命名或删除密钥环。使用 Google Cloud CLI 创建密钥环

    gcloud kms keyrings create storage \
      --location global
    
  2. storage 密钥环中创建一个名为 my-key 的密钥以用于加密。密钥的名称对密钥环具有唯一性。无法重命名或删除密钥,但可以销毁其密钥版本。使用 Google Cloud CLI 创建密钥。系统会自动创建初始密钥版本,并将其作为主要版本。

    gcloud kms keys create my-key \
     --location global \
     --keyring storage \
     --purpose encryption
    

您可以详细了解如何创建密钥环和密钥

对包含密钥的文件进行加密

key-user 用户身份使用这两个项目执行此过程。

  1. 在本地机器上,创建一个名为 my-secret.txt 的文件,其中包含文本“This is my secret”。

    echo "This is my secret" > my-secret.txt
    
  2. 使用 my-kms-project 项目中的 my-key 密钥加密 my-secret.txt。将加密后的文件写入 mysecret.txt.encrypted

    gcloud kms encrypt \
     --location global \
     --keyring storage \
     --key my-key \
     --plaintext-file my-secret.txt \
     --ciphertext-file my-secret.txt.encrypted
    

    如需详细了解如何加密数据,请参阅加密数据快速入门

    请改用 raw-encrypt 进行原始对称加密

  3. 将已加密的 my-secret.txt.encrypted 文件上传到 my-storage-project 项目中的 my-bucket 存储桶。您可以使用 gsutil 命令。

    gsutil cp my-secret.txt.encrypted gs://my-storage-bucket
    

    您可以详细了解如何上传对象到存储桶。

  4. [可选] 从本地机器删除明文 my-secret.txt 文件。对于包含未经加密的敏感数据的文件,这是一种很好的做法。

my-storage-bucket 存储桶现在包含文件 my-secret.txt.encrypted,该文件使用 my-key 密钥加密。

对包含密钥的文件进行解密

key-user 用户身份使用这两个项目执行这些步骤。

  1. my-bucket 存储桶下载 my-secret.txt.encrypted 文件。您可以使用 gsutil 命令。

    gsutil cp gs://my-storage-bucket/my-secret.txt.encrypted .
    

    您可以详细了解如何从存储桶下载对象。

  2. 尝试使用 less 等命令或文本编辑器读取文件。请注意,该文件不是明文文件。

  3. 使用用来加密 my-secret.txt 的同一密钥来解密 my-secret.txt.encrypted,并将解密后的数据保存到名为 my-secret.txt.decrypted 的新的明文文件中。

    gcloud kms decrypt --location global \
     --keyring storage \
     --key my-key \
     --ciphertext-file my-secret.txt.encrypted \
     --plaintext-file my-secret.txt.decrypted
    

    如需详细了解如何解密数据,请参阅加密数据快速入门

    请改用 raw-decrypt 进行原始对称加密

  4. 使用 cat 命令读取 my-secret.txt.decrypted 文件。其内容与 my-secret.txt 的原始内容完全相同。

    cat my-secret.txt.decrypted
    
    This is my secret.
  5. [可选] 从本地机器删除 my-secret.txt.encryptedmy-secret.txt.decrypted 文件。

清理

要清理文件,请删除您在本地机器上创建的所有文件,然后删除 [MY_KMS_PROJECT][MY_STORAGE_PROJECT] 项目。

后续步骤