本主题介绍如何执行以下原始对称密钥操作:
- 在本地或使用 Cloud KMS 加密文本或二进制明文内容。
- 在本地或使用 Cloud KMS 解密密文。
如果您想执行常规(非原始)对称密钥操作, 请参阅使用对称密钥加密和解密数据。
原始对称加密可让您在本地加密和解密数据 或使用 Cloud KMS 迁移加密数据 而无需先解密。 此功能取决于在 操作。如果您想在 Google Cloud 外部使用密文,则必须 请使用导入的密钥,因为 Cloud KMS 中生成的密钥不能 已导出。 这些加密算法会生成标准密文,可由任何标准解密服务解密。我们支持以下原始对称 加密算法:
AES-128-GCM
AES-256-GCM
AES-128-CBC
AES-256-CBC
AES-128-CTR
AES-256-CTR
请注意以下有关这些原始加密算法的内容:
AES-GCM
会基于 和生成身份验证标记,并且是推荐使用的加密算法。使用AES-GCM
算法加密的数据在没有提供的 AAD 的情况下无法解密。AES-CBC
要求明文大小是分块的倍数 大小(16 个字节)。如果明文不是分块大小的倍数, 先填充明文,然后再进行加密;否则操作将失败 一个表示问题的错误。AES-CBC
和AES-CTR
不是经过身份验证的加密方案, 意味着它们更有可能发生意外滥用的风险。它们分别是 为支持传统需求和互操作性需求而提供的, 。为防止意外的滥用,使用这些加密算法 需要以下 IAM 权限:- 针对
AES-CBC
的cloudkms.cryptoKeyVersions.manageRawAesCbcKeys
。 - 针对
AES-CTR
的cloudkms.cryptoKeyVersions.manageRawAesCtrKeys
。
- 针对
所需的角色
如需获取使用原始加密所需的权限, 请让管理员授予您 针对密钥的以下 IAM 角色:
-
仅加密:
Cloud KMS CryptoKey Encrypter (
roles/cloudkms.cryptoKeyEncrypter
) -
如需仅解密,请执行以下操作:
Cloud KMS CryptoKey Decrypter (
roles/cloudkms.cryptoKeyDecrypter
) -
如需加密和解密,请执行以下操作:
Cloud KMS CryptoKey Encrypter/Decrypter (
roles/cloudkms.cryptoKeyEncrypterDecrypter
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
未经身份验证的原始加密算法所需的其他角色
- 如需使用
AES-CBC
密钥,请通过 Cloud KMS Expert 原始 AES-CBC 密钥管理器 (roles/cloudkms.expertRawAesCbc
) - 如需使用
AES-CTR
密钥,请使用 Cloud KMS Expert Raw AES-CTR Key Manager (roles/cloudkms.expertRawAesCtr
)
准备工作
加密
gcloud
如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI。
gcloud kms raw-encrypt \ --location LOCATION \ --keyring KEY_RING \ --key KEY_NAME \ --version KEY_VERSION \ --plaintext-file INPUT_FILE_PATH \ --ciphertext-file OUTPUT_FILE_PATH
替换以下内容:
LOCATION
:密钥环的 Cloud KMS 位置。KEY_RING
:包含密钥的密钥环的名称。KEY_NAME
:要用于加密的密钥的名称。KEY_VERSION
:要用于加密的密钥版本的 ID。INPUT_FILE_PATH
:用于读取明文数据的本地文件路径。OUTPUT_FILE_PATH
:用于保存加密输出的本地文件路径。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
使用 JSON 和 REST API 时,内容必须先进行 base64 编码,然后才能 由 Cloud KMS 加密。
使用 rawEncrypt
方法加密明文数据:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION:rawEncrypt" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --data '{"plaintext": "BASE64_ENCODED_INPUT", "additionalAuthenticatedData": "BASE64_ENCODED_AAD"}'
替换以下内容:
PROJECT_ID
:包含密钥环的项目的 ID。LOCATION
:密钥环的 Cloud KMS 位置。KEY_RING
:包含密钥的密钥环的名称。KEY_NAME
:要用于加密的密钥的名称。KEY_VERSION
:要用于加密的密钥版本的 ID。BASE64_ENCODED_INPUT
:base64 编码的明文 您要加密的数据。BASE64_ENCODED_AAD
:base64 编码的额外项 经过身份验证的数据,用于提供完整性和真实性 保证。此字段仅适用于AES-GCM
算法。
输出是一个 JSON 对象,其中包含以 base64 编码字符串形式提供的加密密文和关联的初始化向量。
解密
gcloud
如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI。
gcloud kms raw-decrypt \ --location LOCATION \ --keyring KEY_RING \ --key KEY_NAME \ --version KEY_VERSION \ --ciphertext-file INPUT_FILE_PATH \ --plaintext-file OUTPUT_FILE_PATH
替换以下内容:
LOCATION
:密钥环的 Cloud KMS 位置。KEY_RING
:包含密钥的密钥环的名称。KEY_NAME
:要用于加密的密钥的名称。KEY_VERSION
:要用于加密的密钥版本的 ID。INPUT_FILE_PATH
:您要解密的密文的本地文件路径。OUTPUT_FILE_PATH
:用于保存解密后的明文的本地文件路径。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
使用 REST API 时,内容必须先进行 base64 编码,然后才能 使用 Cloud KMS 解密
如需对加密后的数据进行解密,请使用 rawDecrypt
方法:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION:rawDecrypt" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --data '{"ciphertext": "BASE64_ENCODED_DATA", "additionalAuthenticatedData": "BASE64_ENCODED_AAD", "initializationVector": "BASE64_ENCODED_IV"}'
替换以下内容:
PROJECT_ID
:包含密钥环的项目的 ID。LOCATION
:密钥环的 Cloud KMS 位置。KEY_RING
:包含密钥的密钥环的名称。KEY_NAME
:要用于解密的密钥的名称。KEY_VERSION
:要用于解密的密钥版本的 ID。BASE64_ENCODED_DATA
:base64 编码的密文 您想要解密的数据文件。BASE64_ENCODED_AAD
:base64 编码的额外项 在加密数据时使用的经过身份验证的数据。此字段 仅适用于AES-GCM
算法。BASE64_ENCODED_IV
:使用 base64 编码的初始化 加密数据时使用的矢量。
输出是一个 JSON 对象,其中包含以 base64 编码的字符串形式的解密明文。
后续步骤
- 详细了解如何导入密钥版本
- 详细了解信封加密。
- 尝试使用 Cloud KMS Codelab 加密和解密数据。