RAW 对称加密

本主题介绍如何执行以下原始对称密钥操作:

  • 在本地或使用 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 根据经过身份验证的额外数据 (AAD) 提供身份验证,并生成身份验证标记。建议使用该加密算法。如果没有提供的 AAD,使用 AES-GCM 算法加密的数据将无法解密。

  • AES-CBC 要求明文大小是块大小(16 字节)的倍数。如果明文不是块大小的倍数,请在加密之前填充明文,否则操作将失败,并显示指示问题的错误消息。

  • AES-CBCAES-CTR 不是经过身份验证的加密方案,这意味着它们可能会存在更大的意外误用风险。提供它们是为了满足旧版和互操作性需求,应谨慎使用。为防止意外滥用,使用这些加密算法需要以下 IAM 权限:

    • 针对AES-CBCcloudkms.cryptoKeyVersions.manageRawAesCbcKeys
    • 针对AES-CTRcloudkms.cryptoKeyVersions.manageRawAesCtrKeys

所需的角色

如需获取使用原始加密所需的权限,请让管理员向您授予密钥的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

适用于未经身份验证的原始加密算法的其他角色

  • 如需使用 AES-CBC 密钥,请执行以下操作:Cloud KMS 专家原始 AES-CBC 密钥管理器 (roles/cloudkms.expertRawAesCbc)
  • 如需使用 AES-CTR 密钥,请执行以下操作:Cloud KMS 专家原始 AES-CTR 密钥管理器 (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 编码的字符串形式解密的明文。

后续步骤