加密应用数据

本页介绍了一种在通过网络传输数据之前,使用 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 存储桶。这些密钥将作为对象存储在存储桶中。此项目称为 STORAGE_PROJECT_ID

  2. 创建第二个 Google Cloud 项目,以管理用于加密和解密密文的 Cloud KMS 密钥。此项目称为 KEY_PROJECT_ID

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

创建用户

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

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

KEY_PROJECT_ID 项目中执行此过程。

  1. 创建关键管理员账号。

  2. 向关键管理员授予 roles/cloudkms.admin Identity and Access Management 角色。借助此角色,密钥管理员可以创建和管理密钥。

  3. 创建关键用户账号。

  4. 向关键用户授予 roles/cloudkms.cryptoKeyEncrypterDecrypter IAM 角色。具有此角色的用户可以加密和解密数据。

创建存储桶

STORAGE_PROJECT_ID 项目中执行此过程。

  1. 创建一个存储分区(名为 STORAGE_BUCKET)。
  2. 向关键用户账号授予 STORAGE_BUCKET 存储桶的 roles/storage.objectAdmin 角色。

创建加密密钥

KEY_PROJECT_ID 项目中的密钥管理员用户身份执行此过程。

  1. 创建密钥环。密钥环的名称在项目中必须是唯一的。您无法重命名或删除密钥环。使用 Google Cloud CLI 创建密钥串

    gcloud kms keyrings create KEY_RING \
      --location LOCATION
    

    替换以下内容:

    • KEY_RING:要为存储空间密钥环使用的名称,例如 storage
    • LOCATION:您要在其中创建密钥环的位置。此位置应在地理位置上靠近您要创建 Cloud Storage 存储桶的位置。
  2. 在密钥环中创建加密密钥。密钥的名称在密钥环中必须是唯一的。无法重命名或删除密钥,但可以销毁其密钥版本。使用 Google Cloud CLI 创建密钥。系统会自动创建初始密钥版本,并将其作为主要版本。

    gcloud kms keys create KEY_NAME \
      --location LOCATION \
      --keyring KEY_RING \
      --purpose encryption
    

    替换以下内容:

    • LOCATION:您创建密钥环的位置。
    • KEY_NAME:要为存储密钥使用的名称,例如 storage
    • KEY_RING:您为存储空间密钥环使用的名称,例如 storage

    注意:如需使用原始对称加密密钥,请将“用途”字段设置为 raw-encryption

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

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

以关键用户账号执行此过程,并在两个项目中执行。

  1. 在本地机器上,保存密钥。

    echo "SECRET_TEXT" > PATH_TO_SECRET
    

    替换以下内容:

    • SECRET_TEXT:您要保护的 Secret(以纯文本形式提供),例如 this is a secret
    • PATH_TO_SECRET:您要创建 Secret 的路径,例如 secret.txt
  2. 使用 Cloud KMS 和加密密钥加密密钥。

    gcloud kms encrypt \
      --location LOCATION \
      --keyring KEY_RING \
      --key KEY_NAME \
      --plaintext-file PATH_TO_SECRET \
      --ciphertext-file PATH_TO_ENCRYPTED_SECRET
    

    替换以下内容:

    • LOCATION:您创建密钥环的位置。
    • KEY_RING:密钥环的名称。
    • KEY_NAME:加密密钥的名称。
    • PATH_TO_SECRET:您创建 Secret 的路径。
    • PATH_TO_ENCRYPTED_SECRET:您要保存加密 Secret 的路径,例如 secret.txt.encrypted

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

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

  3. 将加密的 Secret 文件上传到存储桶。您可以使用以下 gcloud CLI 命令:

    gcloud storage cp PATH_TO_ENCRYPTED_SECRET gs://STORAGE_BUCKET
    

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

  4. 可选:从本地机器中删除明文 Secret 文件 (PATH_TO_SECRET)。对于包含未经加密的敏感数据的文件,这是一种很好的做法。

STORAGE_BUCKET 存储桶现在包含加密的 Secret 文件,该文件使用 KEY_NAME 加密密钥加密。

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

以密钥用户账号执行这些步骤,并在两个项目中工作。

  1. 从存储桶下载加密的 Secret 文件。您可以使用以下 gcloud CLI 命令:

    gcloud storage cp gs://STORAGE_BUCKET/PATH_TO_ENCRYPTED_SECRET .
    

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

  2. 使用加密文件时所用的密钥解密文件。

    gcloud kms decrypt --location LOCATION \
      --keyring KEY_RING \
      --key KEY_NAME \
      --ciphertext-file PATH_TO_ENCRYPTED_SECRET \
      --plaintext-file PATH_TO_DECRYPTED_SECRET
    

    替换以下内容:

    • LOCATION:您创建密钥环的位置。
    • KEY_RING:密钥环的名称。
    • KEY_NAME:加密密钥的名称。
    • PATH_TO_ENCRYPTED_SECRET:下载的加密 Secret 的路径,例如 secret.txt.encrypted
    • PATH_TO_DECRYPTED_SECRET:您要保存已解密 Secret 的路径,例如 secret_decrypted.txt

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

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

    现在,您可以使用 cat 或文本编辑器读取 Secret 的解密明文。其内容与 PATH_TO_SECRET 的原始内容完全相同。

  3. 可选:从本地机器删除 PATH_TO_ENCRYPTED_SECRETPATH_TO_DECRYPTED_SECRET 文件。

清理

如需清理文件,请删除您在本地机器上创建的所有文件,然后删除 KEY_PROJECT_IDSTORAGE_PROJECT_ID 项目。

后续步骤