使用 Cloud KMS(非对称)加密和解密数据

1. 概览

Cloud KMS 是一项云托管式密钥管理服务,让您能够使用与本地部署时相同的方式为自己的云服务管理加密密钥。它支持使用各种密钥类型和来源(包括用于硬件支持的密钥的 Cloud HSM)进行加密、解密、签名和验证。本教程介绍如何使用非对称 Cloud KMS 密钥加密和解密数据。

您将学习以下内容

  • 如何启用 Cloud KMS API
  • 如何创建密钥环
  • 如何为非对称加密/解密创建加密密钥

2. 设置和要求

自定进度的环境设置

  1. 登录 Cloud 控制台,然后创建一个新项目或重复使用现有项目。 (如果您还没有 Gmail 或 G Suite 账号,则必须创建一个。)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

请记住项目 ID,它在所有 Google Cloud 项目中都是唯一的名称(上述名称已被占用,您无法使用,抱歉!)。它稍后将在此 Codelab 中被称为 PROJECT_ID

  1. 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。

运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分中的所有说明操作,该部分介绍了如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

启动 Cloud Shell

在此 Codelab 中,您将使用 Cloud Shell,这是一个在 Google Cloud 上运行的免费虚拟化环境。在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

vezHz_9nBUSt_0pD8eMHkzgHehRa83ILgMpcztEJtGZspECiZTk47O02PYk6Zp7jyStful3AIDEZU8qcCNbiXF4WcpkUdJi2LoUbxTWg4cZ4skDnvGKNywBZlDBzzWha111IZ1KqXQ

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

wQQCzLZ7_omk2cuoBaKVPnniKDFG6MsP8h2OA0j3Iw9LRSFQ9TkD6Ccq4dcUASPoD5UKe1Ur7bIgYn5gAh2r6BlQDnpFmgyAtv9x2D6ppXS0pfjfxViuEfoetgLvgVeduekc2hgU2Q

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。除非另有说明,否则请在此 shell 中运行所有命令。

3. 启用 Cloud KMS 服务

您必须先在项目中启用 Cloud KMS 服务,然后才能使用该服务。此操作只需要针对每个项目执行一次。如需启用 Cloud KMS 服务,请运行以下命令:

$ gcloud services enable cloudkms.googleapis.com \
    --project "${GOOGLE_CLOUD_PROJECT}"

启用最多可能需要一分钟。该命令完成后会报告成功。

4. 创建 KMS 密钥

创建 Cloud KMS 密钥环。在 Cloud KMS 中,密钥环是加密密钥的逻辑集合。密钥环包含有关密钥的元数据,例如其位置。在 global 区域中创建一个名为 my-keyring 的密钥环:

$ gcloud kms keyrings create "my-keyring" \
    --location "global"

现在,在刚刚创建的密钥环中创建一个用途为 asymmetric-encryption 的 CryptoKey,并将其命名为 my-asymmetric-encryption-key

$ gcloud kms keys create "my-asymmetric-encryption-key" \
    --location "global" \
    --keyring "my-keyring" \
    --purpose "asymmetric-encryption" \
    --default-algorithm "rsa-decrypt-oaep-4096-sha512"

5. 加密数据

对于非对称密钥,Cloud KMS 不会执行加密。相反,它会提供对公钥的访问权限,您可以通过公钥加密使用该公钥加密数据。使用非对称密钥时,加密可以完全离线完成,无需访问 Cloud KMS 或任何其他 Google Cloud API。加密操作可以使用 openssl 等加密工具执行,也可以使用支持公钥加密的编程语言或库执行。

从 Cloud KMS 下载公钥:

$ gcloud kms keys versions get-public-key "1" \
    --location "global" \
    --keyring "my-keyring" \
    --key "my-asymmetric-encryption-key" \
    --output-file ./key.pub

创建一个包含要加密的数据的文件,然后使用 openssl 命令行工具加密该文件中的数据:

$ echo "my-contents" > ./data.txt
$ openssl pkeyutl -encrypt -pubin \
    -in ./data.txt \
    -inkey ./key.pub \
    -pkeyopt "rsa_padding_mode:oaep" \
    -pkeyopt "rsa_oaep_md:sha512" \
    -pkeyopt "rsa_mgf1_md:sha512" > ./data.txt.enc

加密后的数据(也称为“密文”)将保存在磁盘上的 data.txt.enc 中。如果您打开 data.txt.enc 文件,会发现其中包含奇怪的不可打印字符。这是因为生成的数据采用二进制格式

在数据库中存储密文或将其作为 HTTP 请求的一部分进行传输时,您可能需要对数据进行编码。密文最常用的编码机制是 base64。

Cloud KMS 不会存储您提供的任何明文。您需要将此密文保存在安全位置,因为检索明文值时需要用到它。

6. 解密数据

与加密不同,解密使用非对称 Cloud KMS 密钥加密的数据需要在线访问 Cloud KMS 服务。使用 gcloud 命令行工具解密文件中的密文:

$ gcloud kms asymmetric-decrypt \


    --location "global" \
    --keyring "my-keyring" \
    --key "my-asymmetric-encryption-key" \
    --version "1" \
    --plaintext-file - \
    --ciphertext-file ./data.txt.enc

gcloud 命令行工具从文件中读取密文,并使用 Cloud KMS 对其进行解密。请注意,此示例将 --plaintext-file 实参指定为 -。这会指示 gcloud 将结果输出到终端。

控制台将打印 my-contents,这与上述文件中的明文值相同。

7. 恭喜!

您已启用 Cloud KMS API,创建了非对称加密密钥,并对数据进行了加密和解密!Cloud KMS 是一款功能强大的产品,加密/解密只是其功能的冰山一角。

清理

如果您已完成探索,请考虑删除项目。

  • 前往 Cloud Platform 控制台
  • 选择要关停的项目,然后点击顶部的“删除”。这会安排删除相应项目。

了解详情

许可

此作品已获得 Creative Commons Attribution 2.0 通用许可授权。