原始對稱式加密

本主題說明如何執行下列原始對稱金鑰作業:

  • 在本機或使用 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) 提供驗證,並產生驗證標記,是建議使用的加密演算法。使用 AES-GCM 演算法加密的資料,如果沒有提供 AAD,就無法解密。

  • AES-CBC 要求明文大小必須是區塊大小 (16 位元組) 的倍數。如果明文不是區塊大小的倍數,請先填充明文再加密;否則,作業會失敗,並顯示指出問題的錯誤。

  • AES-CBCAES-CTR 並非經過驗證的加密方案,因此可能會帶來意外濫用的風險。這些 API 可支援舊版和互通性需求,因此應謹慎使用。為避免隨意濫用,使用這些加密演算法需要下列 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 編碼字串形式呈現的解密明文。

後續步驟