本主題說明如何使用 Cloud Key Management Service 對稱金鑰重新加密資料。您可以將這些範例套用至非對稱金鑰。如果您懷疑有未經授權使用金鑰的情況,建議您重新加密受該金鑰保護的資料,然後對之前的金鑰版本執行停用或安排銷毀作業。
事前準備
這種情況需要符合下列條件。
您已經使用 Cloud KMS 加密資料。
您未停用、安排刪除或刪除用於加密的金鑰版本。您可以使用這個金鑰版本對已加密的資料進行解密。
使用非對稱金鑰重新加密資料
本主題的範例說明如何使用對稱金鑰重新加密資料。使用對稱金鑰時,Cloud KMS 會自動推斷要用於解密的金鑰版本。使用非對稱金鑰時,您必須指定金鑰版本。
- 按照 Google Cloud CLI 使用說明操作時,請務必加入
--version
旗標。 - 按照 API 使用說明操作時,請使用
CryptoKeyVersions
,而非CryptoKeys
。如要進一步瞭解如何透過非對稱金鑰加密及解密資料,請參閱相關說明。
使用非對稱金鑰重新加密資料的工作流程與本主題所述的類似。
重新加密資料的工作流程
請按照下列步驟重新加密資料,並停用或安排刪除用於原始加密的金鑰版本。
使用之前的金鑰版本解密資料
Cloud KMS 會自動使用正確的金鑰版本解密資料,前提是您尚未停用、安排刪除,或是刪除該金鑰版本。下列範例會說明如何解密資料。這裡使用的解密程式碼,與在加密與解密中使用的程式碼相同。
gcloud
如要在指令列上使用 Cloud KMS,請先安裝或升級至最新版 Google Cloud CLI。
gcloud kms decrypt \ --key KEY_NAME \ --keyring KEY_RING \ --location LOCATION \ --ciphertext-file FILE_TO_DECRYPT \ --plaintext-file DECRYPTED_OUTPUT
更改下列內容:
KEY_NAME
:要用於解密的金鑰名稱。KEY_RING
:金鑰所屬金鑰環的名稱。LOCATION
:包含金鑰環的 Cloud KMS 位置。FILE_TO_DECRYPT
:要解密的檔案路徑。DECRYPTED_OUTPUT
:您要儲存解密輸出內容的路徑。
如需所有旗標和可能值的相關資訊,請搭配 --help
旗標執行指令。
C#
如要執行這段程式碼,請先設定 C# 開發環境,然後安裝 Cloud KMS C# SDK。
Go
如要執行這段程式碼,請先設定 Go 開發環境,然後安裝 Cloud KMS Go SDK。
Java
如要執行這段程式碼,請先設定 Java 開發環境,然後安裝 Cloud KMS Java SDK。
Node.js
如要執行這段程式碼,請先設定 Node.js 開發環境,然後安裝 Cloud KMS Node.js SDK。
PHP
如要執行這段程式碼,請先瞭解如何在 Google Cloud上使用 PHP,並安裝 Cloud KMS PHP SDK。
Python
如要執行這段程式碼,請先設定 Python 開發環境,然後安裝 Cloud KMS Python SDK。
Ruby
如要執行這段程式碼,請先設定 Ruby 開發環境,然後安裝 Cloud KMS Ruby SDK。
API
這些範例會使用 curl 做為 HTTP 用戶端,以示範如何使用 API。如要進一步瞭解存取控制,請參閱「存取 Cloud KMS API」。
以 JSON 格式從 Cloud KMS 傳回的解密文字採用 base64 編碼。
如要解密已加密資料,請提出 POST
要求,並提供適當專案與金鑰資訊,然後在要求主體的 ciphertext
欄位中指定要解密的加密文字 (也稱為 ciphertext)。
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME:decrypt" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --data "{\"ciphertext\": \"ENCRYPTED_DATA\"}"
更改下列內容:
PROJECT_ID
:專案 ID,其中包含您要用於解密的金鑰環和金鑰。LOCATION
:包含金鑰環的 Cloud KMS 位置。KEY_RING
:包含您要用於解密的金鑰的金鑰環。KEY_NAME
:要用於解密的金鑰名稱。ENCRYPTED_DATA
:您要解密的加密資料。
以下是使用 Base64 編碼資料的承載範例:
{ "ciphertext": "CiQAhMwwBo61cHas7dDgifrUFs5zNzBJ2uZtVFq4ZPEl6fUVT4kSmQ...", }
使用新的主要金鑰版本重新加密資料
Cloud KMS 會自動使用新的主要金鑰版本加密資料。下列範例示範如何加密資料。這裡使用的加密程式碼,與在加密與解密中使用的程式碼相同。
gcloud
如要在指令列上使用 Cloud KMS,請先安裝或升級至最新版 Google Cloud CLI。
gcloud kms encrypt \ --key KEY_NAME \ --keyring KEY_RING \ --location LOCATION \ --plaintext-file FILE_TO_ENCRYPT \ --ciphertext-file ENCRYPTED_OUTPUT
更改下列內容:
KEY_NAME
:您要用於加密的金鑰名稱。KEY_RING
:金鑰所屬金鑰環的名稱。LOCATION
:包含金鑰環的 Cloud KMS 位置。FILE_TO_ENCRYPT
:要加密的檔案路徑。ENCRYPTED_OUTPUT
:您要儲存加密輸出內容的路徑。
如需所有旗標和可能值的相關資訊,請搭配 --help
旗標執行指令。
C#
如要執行這段程式碼,請先設定 C# 開發環境,然後安裝 Cloud KMS C# SDK。
Go
如要執行這段程式碼,請先設定 Go 開發環境,然後安裝 Cloud KMS Go SDK。
Java
如要執行這段程式碼,請先設定 Java 開發環境,然後安裝 Cloud KMS Java SDK。
Node.js
如要執行這段程式碼,請先設定 Node.js 開發環境,然後安裝 Cloud KMS Node.js SDK。
PHP
如要執行這段程式碼,請先瞭解如何在 Google Cloud上使用 PHP,並安裝 Cloud KMS PHP SDK。
Python
如要執行這段程式碼,請先設定 Python 開發環境,然後安裝 Cloud KMS Python SDK。
Ruby
如要執行這段程式碼,請先設定 Ruby 開發環境,然後安裝 Cloud KMS Ruby SDK。
API
這些範例會使用 curl 做為 HTTP 用戶端,以示範如何使用 API。如要進一步瞭解存取控制,請參閱「存取 Cloud KMS API」。
使用 JSON 和 REST API 時,內容必須先採用 base64 編碼,才能由 Cloud KMS 加密。
如要加密資料,請提出 POST
要求,並提供適當專案與金鑰資訊,然後在要求主體的 plaintext
欄位中指定待加密的 base64 編碼文字。
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME:encrypt" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --data "{\"plaintext\": \"PLAINTEXT_TO_ENCRYPT\"}"
更改下列內容:
PROJECT_ID
:包含金鑰環和要用於加密的金鑰的專案 ID。LOCATION
:包含金鑰環的 Cloud KMS 位置。KEY_RING
:包含要用於加密的金鑰的金鑰環。KEY_NAME
:您要用於加密的金鑰名稱。PLAINTEXT_TO_ENCRYPT
:您要加密的明文資料。您必須先將明文編碼為 base64,才能呼叫encrypt
方法。
以下是使用 Base64 編碼資料的承載範例:
{ "plaintext": "U3VwZXIgc2VjcmV0IHRleHQgdGhhdCBtdXN0IGJlIGVuY3J5cHRlZAo=", }
停用或安排刪除之前的金鑰版本
如果您先前因為回應可疑事件而輪替金鑰,請在重新加密資料之後,停用或安排刪除之前的金鑰版本。
停用已啟用的金鑰版本
您只能停用已啟用的金鑰版本,而您可以使用方法 UpdateCryptoKeyVersion
來完成。
控制台
前往 Google Cloud 控制台的「Key Management」頁面。
按一下金鑰環名稱,該金鑰環包含您將停用金鑰版本的金鑰。
按一下您要停用金鑰版本的金鑰。
找出要停用的金鑰版本,然後勾選旁邊的方塊。
按一下頁首中的「停用」。
在確認提示中,按一下「停用」。
gcloud
如要在指令列上使用 Cloud KMS,請先安裝或升級至最新版 Google Cloud CLI。
gcloud kms keys versions disable key-version \ --key key \ --keyring key-ring \ --location location
將 key-version 替換為要停用的金鑰版本。將 key 替換為金鑰名稱。將 key-ring 替換為金鑰所在的金鑰環名稱。將 location 替換為金鑰環的 Cloud KMS 位置。
如需所有旗標和可能值的相關資訊,請搭配 --help
旗標執行指令。
C#
如要執行這段程式碼,請先設定 C# 開發環境,然後安裝 Cloud KMS C# SDK。
Go
如要執行這段程式碼,請先設定 Go 開發環境,然後安裝 Cloud KMS Go SDK。
Java
如要執行這段程式碼,請先設定 Java 開發環境,然後安裝 Cloud KMS Java SDK。
Node.js
如要執行這段程式碼,請先設定 Node.js 開發環境,然後安裝 Cloud KMS Node.js SDK。
PHP
如要執行這段程式碼,請先瞭解如何在 Google Cloud上使用 PHP,並安裝 Cloud KMS PHP SDK。
Python
如要執行這段程式碼,請先設定 Python 開發環境,然後安裝 Cloud KMS Python SDK。
Ruby
如要執行這段程式碼,請先設定 Ruby 開發環境,然後安裝 Cloud KMS Ruby SDK。
安排刪除金鑰版本
您只能安排刪除已啟用或已停用的金鑰版本,而您可以使用方法 DestroyCryptoKeyVersion
來完成。
控制台
前往 Google Cloud 控制台的「Key Management」頁面。
找出要安排時間表進行刪除的金鑰版本,然後勾選旁邊的方塊。
按一下頁首的「Destroy」。
在確認提示中輸入金鑰名稱,然後按一下「Schedule Destruction」。
gcloud
如要在指令列上使用 Cloud KMS,請先安裝或升級至最新版 Google Cloud CLI。
gcloud kms keys versions destroy KEY_VERSION \ --key KEY_NAME \ --keyring KEY_RING \ --location LOCATION
更改下列內容:
KEY_VERSION
:要銷毀的金鑰版本版本號碼。KEY_NAME
:您要銷毀鍵版本的鍵名稱。KEY_RING
:金鑰所屬金鑰環的名稱。LOCATION
:金鑰環的 Cloud KMS 位置。
如需所有旗標和可能值的相關資訊,請搭配 --help
旗標執行指令。
C#
如要執行這段程式碼,請先設定 C# 開發環境,然後安裝 Cloud KMS C# SDK。
Go
如要執行這段程式碼,請先設定 Go 開發環境,然後安裝 Cloud KMS Go SDK。
Java
如要執行這段程式碼,請先設定 Java 開發環境,然後安裝 Cloud KMS Java SDK。
Node.js
如要執行這段程式碼,請先設定 Node.js 開發環境,然後安裝 Cloud KMS Node.js SDK。
PHP
如要執行這段程式碼,請先瞭解如何在 Google Cloud上使用 PHP,並安裝 Cloud KMS PHP SDK。
Python
如要執行這段程式碼,請先設定 Python 開發環境,然後安裝 Cloud KMS Python SDK。
Ruby
如要執行這段程式碼,請先設定 Ruby 開發環境,然後安裝 Cloud KMS Ruby SDK。
API
這些範例會使用 curl 做為 HTTP 用戶端,以示範如何使用 API。如要進一步瞭解存取控制,請參閱「存取 Cloud KMS API」。
呼叫 CryptoKeyVersions.destroy 方法,刪除金鑰版本。
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION:destroy" \ --request "POST" \ --header "authorization: Bearer TOKEN"