本主題說明如何執行下列原始對稱金鑰作業:
- 在本地或使用 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 權限:AES-CBC
的「cloudkms.cryptoKeyVersions.manageRawAesCbcKeys
」。AES-CTR
的「cloudkms.cryptoKeyVersions.manageRawAesCtrKeys
」。
必要的角色
如要取得使用原始加密所需的權限,請要求管理員在金鑰上授予下列 IAM 角色:
-
僅加密:
Cloud KMS CryptoKey 加密者 (
roles/cloudkms.cryptoKeyEncrypter
) -
僅解密:
Cloud KMS CryptoKey 解密者 (
roles/cloudkms.cryptoKeyDecrypter
) -
如要加密及解密:
Cloud KMS CryptoKey 加密者/解密者 (
roles/cloudkms.cryptoKeyEncrypterDecrypter
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
未經驗證的原始加密演算法的其他角色
- 如要使用
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 編碼字串表示的解密純文字。
後續步驟
- 進一步瞭解如何匯入金鑰版本
- 進一步瞭解信封式加密。
- 嘗試使用 Cloud KMS 加密及解密資料程式碼研究室。