本主题介绍了如何执行以下原始对称密钥操作:
- 在本地或使用 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-CBC和- AES-CTR不是经过身份验证的加密方案,这意味着它们可能存在更高的误用风险。这些角色旨在支持旧版需求和互操作性需求,应谨慎使用。为防止随意滥用,使用这些加密算法需要以下 IAM 权限:- cloudkms.cryptoKeyVersions.manageRawAesCbcKeys,- AES-CBC。
- cloudkms.cryptoKeyVersions.manageRawAesCtrKeys,- AES-CTR。
 
所需的角色
如需获得使用原始加密所需的权限,请让您的管理员为您授予密钥的以下 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 Raw AES-CBC Key Manager (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 加密和解密数据。