原始對稱式加密

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

  • 在本地或使用 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-CBC 的「cloudkms.cryptoKeyVersions.manageRawAesCbcKeys」。
    • AES-CTR 的「cloudkms.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 編碼字串表示的解密純文字。

後續步驟