加密用户数据

下面介绍了如何在受众群体成员提取请求中发送加密数据。

设置 Google Cloud 命令行界面

  1. 安装并初始化 Google Cloud 命令行界面。

  2. 如需确保您的 gcloud 组件是最新的,请运行以下命令。

    gcloud components update
    
  3. 如需选择或创建新的 Google Cloud 项目并启用 Cloud Key Management Service,请点击启用 Cloud KMS

    启用 Cloud KMS
  4. 如需在环境中设置项目,请使用 gcloud config set 命令。如需检查项目是否已在您的环境中设置,请运行 gcloud config list

    如果未设置 project,或者您想为密钥使用其他项目,请运行 gcloud config set

    gcloud config set project PROJECT_ID
    

创建密钥

如需了解详情,请参阅 Key Management Service 文档

  1. 创建密钥环。

    gcloud kms keyrings create KEY_RING_NAME \
        --location KEY_RING_LOCATION
    

    如需了解详情,请参阅创建钥匙串

  2. 在密钥环中创建密钥。ROTATION_PERIOD 表示轮替密钥的时间间隔,NEXT_ROTATION_TIME 表示应发生第一次轮替的日期和时间。

    例如,如需每 30 天轮替一次密钥,并在 1 周内执行首次轮替,请将 ROTATION_PERIOD 设为 30d,并将 NEXT_ROTATION_TIME 设为 $(date --utc --date="next week" --iso-8601=seconds)

    gcloud kms keys create KEY_NAME \
        --keyring KEY_RING_NAME \
        --location KEY_RING_LOCATION \
        --purpose "encryption" \
        --rotation-period ROTATION_PERIOD \
        --next-rotation-time "NEXT_ROTATION_TIME"
    

    如需了解详情,请参阅创建密钥

创建工作负载身份池提供方

本部分简要介绍了工作负载身份联合。如需了解详情,请参阅 Workload Identity Federation 文档

  1. 创建工作负载身份池(在开发中)。池的 location 必须为 global

    gcloud iam workload-identity-pools create WIP_ID \
       --location=global \
       --display-name="WIP_DISPLAY_NAME" \
       --description="WIP_DESCRIPTION"
    

    如需了解详情,请参阅管理工作负载身份池和提供方

  2. 创建工作负载身份池提供程序。--attribute-condition 参数用于验证调用方是否为保密匹配服务账号。

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
       --location=global \
       --workload-identity-pool=WIP_ID \
       --display-name="PROVIDER_DISPLAY_NAME" \
       --description="PROVIDER_DESCRIPTION" \
       --attribute-mapping="google.subject=assertion.sub,google.groups=[\"PROVIDER_ID\"]" \
       --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
         'STABLE' in assertion.submods.confidential_space.support_attributes &&
         ['cfm-services@admcloud-cfm-services.iam.gserviceaccount.com'].exists(
             a, a in assertion.google_service_accounts) &&
         'ECDSA_P256_SHA256:6b1f357b59e9407fb017ca0e3e783b2bd5acbfea6c83dd82971a4150df5b25f9'
         in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id)" \
       --issuer-uri="https://confidentialcomputing.googleapis.com" \
       --allowed-audiences="https://sts.googleapis.com"
    
  3. 向 WIP 提供程序授予密钥解密者角色。

    # Grants the role to the WIP provider.
    gcloud kms keys add-iam-policy-binding KEY_NAME \
        --keyring KEY_RING_NAME \
        --location KEY_RING_LOCATION \
        --member "principalSet://iam.googleapis.com/projects/PROJECT_ID/locations/global/workloadIdentityPools/WIP_ID/group/PROVIDER_ID" \
        --role "roles/cloudkms.cryptoKeyDecrypter"
    

加密数据

在 Data Manager API 中进行加密需要使用数据加密密钥 (DEK)。DEK 是一种对称密钥,用于加密数据。DEK 使用您的 Google Cloud KMS 密钥进行加密。您可以在请求中发送加密的 DEK。

如需准备请求中要加密的数据,请遵循与未加密数据相同的格式和哈希处理准则

请勿对未经过哈希处理的值进行加密。例如,AddressInforegion_codepostal_code

对每个字段的数据进行格式设置和哈希处理后,请按照以下步骤对哈希值进行加密:

  1. 使用 Base64 编码对哈希字节进行编码。
  2. 使用 DEK 对经过 Base64 编码的哈希进行加密。
  3. 使用十六进制或 Base64 编码对加密流程的输出进行编码。
  4. 使用该字段的编码值。
  5. 请求中设置 encryption_infoencoding

如需完成最后一步,请修改 IngestAudienceMembersRequest 以指明您已对数据进行加密:

  • 设置 encryption_info 字段。
  • encoding 字段设置为用于对加密字段值进行编码的编码。

以下是已设置加密和编码字段的请求代码段:

{
  ...
  "encryptionInfo": {
    "gcpWrappedKeyInfo": {
      "kekUri": "gcp-kms://projects/PROJECT_ID/locations/KEY_RING_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME",
      "wipProvider": "projects/PROJECT_ID/locations/global/workloadIdentityPools/WIP_ID/providers/PROVIDER_ID",
      "keyType": "XCHACHA20_POLY1305",
      "encryptedDek": "ENCRYPTED_DEK"
    }
  },
  "encoding": "ENCODING"
}

如需使用 Data Manager API 库和实用程序构建和发送请求,请参阅适用于 Java 的 IngestAudienceMembersWithEncryption 代码示例或适用于 Python 的 ingest_audience_members_with_encryption 代码示例。