本主题介绍如何使用 Cloud Key Management Service 对称密钥重新加密数据。 您可以根据非对称密钥调整这些示例。 如果您怀疑存在未经授权使用密钥的情况,则应当重新加密受该密钥保护的数据,然后停用或安排销毁先前的密钥版本。
准备工作
此场景需要以下条件。
您已使用 Cloud KMS 加密了数据。
用于加密的密钥版本并非处于已停用、计划销毁或已销毁状态。您使用此密钥版本对已加密的数据进行解密。
使用非对称密钥重新加密数据
本主题中的示例展示了如何使用对称密钥重新加密数据。 当您使用对称密钥时,Cloud KMS 会自动推断用于解密的密钥版本。使用非对称密钥时,您必须指定密钥版本。
- 按照 Google Cloud CLI 使用说明操作时,请始终添加
--version
标志。 - 按照 API 的使用说明操作时,请使用
CryptoKeyVersions
而不是CryptoKeys
。您可以详细了解如何使用非对称密钥对数据进行加密和解密。
使用非对称密钥重新加密数据的工作流程类似于本主题中介绍的工作流程。
重新加密数据工作流程
使用以下步骤,重新加密数据并停用或安排销毁最初用于加密的密钥版本。
使用先前的密钥版本解密数据
Cloud KMS 会自动使用正确的密钥版本解密数据,前提是该密钥版本并非处于已停用、已安排销毁或已销毁状态。以下示例显示了如何解密数据。 示例与加密和解密使用的解密代码相同。
gcloud
如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI。
gcloud kms decrypt \ --key KEY_NAME \ --keyring KEY_RING \ --location LOCATION \ --ciphertext-file FILE_TO_DECRYPT \ --plaintext-file DECRYPTED_OUTPUT
替换以下内容:
KEY_NAME
:您要用于解密的密钥的名称。KEY_RING
:包含密钥的密钥环的名称。LOCATION
:包含密钥环的 Cloud KMS 位置。FILE_TO_DECRYPT
:您要解密的文件的路径。DECRYPTED_OUTPUT
:您要保存解密输出的路径。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
从 Cloud KMS 中以 JSON 格式返回的解密后文本使用 base64 进行编码。
如需对加密数据进行解密,请发出 POST
请求并提供相应的项目和密钥信息,并在请求正文的 ciphertext
字段中指定要解密的加密文本(也称为ciphertext)。
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME:decrypt" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --data "{\"ciphertext\": \"ENCRYPTED_DATA\"}"
替换以下内容:
PROJECT_ID
:包含您要用于解密的密钥环和密钥的项目的 ID。LOCATION
:包含密钥环的 Cloud KMS 位置。KEY_RING
:包含您要用于解密的密钥的密钥环。KEY_NAME
:您要用于解密的密钥的名称。ENCRYPTED_DATA
:您要解密的加密数据。
以下是包含 base64 编码数据的示例载荷:
{ "ciphertext": "CiQAhMwwBo61cHas7dDgifrUFs5zNzBJ2uZtVFq4ZPEl6fUVT4kSmQ...", }
使用新的主密钥版本重新加密数据
Cloud KMS 自动使用新的主密钥版本来加密数据。以下示例显示了如何加密数据。示例与加密和解密中使用的加密代码相同。
gcloud
如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI。
gcloud kms encrypt \ --key KEY_NAME \ --keyring KEY_RING \ --location LOCATION \ --plaintext-file FILE_TO_ENCRYPT \ --ciphertext-file ENCRYPTED_OUTPUT
替换以下内容:
KEY_NAME
:您要用于加密的密钥的名称。KEY_RING
:包含密钥的密钥环的名称。LOCATION
:包含密钥环的 Cloud KMS 位置。FILE_TO_ENCRYPT
:您要加密的文件的路径。ENCRYPTED_OUTPUT
:您要保存加密输出的路径。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
使用 JSON 和 REST API 时,内容必须先进行 base64 编码,然后才能由 Cloud KMS 加密。
如需加密数据,请发出 POST
请求并提供相应的项目和密钥信息,并在请求正文的 plaintext
字段中指定要加密的 base64 编码文本。
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME:encrypt" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --data "{\"plaintext\": \"PLAINTEXT_TO_ENCRYPT\"}"
替换以下内容:
PROJECT_ID
:包含您要用于加密的密钥环和密钥的项目的 ID。LOCATION
:包含密钥环的 Cloud KMS 位置。KEY_RING
:包含您要用于加密的密钥的密钥环。KEY_NAME
:您要用于加密的密钥的名称。PLAINTEXT_TO_ENCRYPT
:您要加密的明文数据。您必须先对明文进行 base64 编码,然后才能调用encrypt
方法。
以下是包含 base64 编码数据的示例载荷:
{ "plaintext": "U3VwZXIgc2VjcmV0IHRleHQgdGhhdCBtdXN0IGJlIGVuY3J5cHRlZAo=", }
停用或安排销毁先前的密钥版本
如果您为了响应可疑突发事件而轮替密钥,重新加密数据后,请停用或安排销毁先前的密钥版本。
停用已启用的密钥版本
只有已启用的密钥版本才能被停用。您可以通过 UpdateCryptoKeyVersion
方法实现这一目的。
控制台
转到 Google Cloud 控制台中的密钥管理页面。
点击您将停用其密钥版本的密钥所在密钥环的名称。
点击您要停用其密钥版本的密钥。
选中要停用的密钥版本旁边的复选框。
点击标头中的停用。
在确认提示中,点击停用。
gcloud
如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI。
gcloud kms keys versions disable key-version \ --key key \ --keyring key-ring \ --location location
将 key-version 替换为要停用的密钥的版本。将 key 替换为密钥的名称。将 key-ring 替换为密钥所在的密钥环的名称。将 location 替换为密钥环的 Cloud KMS 位置。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
安排销毁密钥版本
只有处于已启用或已停用状态的密钥版本可以安排进行销毁。您可以通过 DestroyCryptoKeyVersion
方法实现这一目的。
控制台
在 Google Cloud 控制台中,前往密钥管理页面。
选中要安排销毁的密钥版本旁边的复选框。
点击标头中的销毁。
在确认提示中输入密钥名称,然后点击安排销毁。
gcloud
如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI。
gcloud kms keys versions destroy KEY_VERSION \ --key KEY_NAME \ --keyring KEY_RING \ --location LOCATION
替换以下内容:
KEY_VERSION
:您要销毁的密钥版本的版本号。KEY_NAME
:您要销毁密钥版本的密钥的名称。KEY_RING
:包含密钥的密钥环的名称。LOCATION
:密钥环的 Cloud KMS 位置。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
通过调用 CryptoKeyVersions.destroy 方法销毁密钥版本。
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION:destroy" \ --request "POST" \ --header "authorization: Bearer TOKEN"