本主題說明如何執行下列原始對稱金鑰作業:
- 在本機或使用 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-CBC
和AES-CTR
並非經過驗證的加密方案,因此可能會帶來意外濫用的風險。這些 API 可支援舊版和互通性需求,因此應謹慎使用。為避免隨意濫用,使用這些加密演算法需要下列 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 程式碼研究室加密及解密資料。