加密使用者資料

以下說明如何在目標對象成員攝入要求中傳送加密資料。

設定 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
    

建立金鑰

詳情請參閱 金鑰管理服務說明文件

  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 聯盟。詳情請參閱 Workload Identity 聯盟說明文件

  1. 建立工作負載身分集區 (WIP)。集區的 location 必須為 global

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

    詳情請參閱「管理 workload identity pool 和提供者」。

  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 程式碼範例。