本文概略介紹 Cloud HSM,並說明如何在 Cloud Key Management Service 中建立及使用 HSM 保護的加密金鑰。
什麼是 Cloud HSM?
Cloud HSM 是雲端託管硬體安全性模組 (HSM) 服務,可讓您託管加密金鑰,並在經 FIPS 140-2 第 3 級認證的 HSM 叢集中執行加密編譯作業。Google 可代管 HSM 叢集,這樣您就不需要擔心分群、資源調度或修補的問題。Cloud HSM 使用 Cloud KMS 做為前端,因此您可以使用 Cloud KMS 提供的所有便利服務與功能。
建立金鑰環
建立金鑰時,您會將金鑰新增至指定 Google Cloud位置的金鑰環。你可以建立新的金鑰環,也可以使用現有的金鑰環。在本主題中,您將建立新的金鑰環,並在其中新增金鑰。
在支援 Cloud HSM 的 Google Cloud 位置建立金鑰環。
控制台
前往 Google Cloud 控制台的「Key Management」頁面。
按一下 [Create key ring] (建立金鑰環)。
在「金鑰環名稱」中,輸入金鑰環的名稱。
在「Key ring location」(金鑰環位置) 部分,選取位置,例如
"us-east1"。點選「建立」。
gcloud
-
在 Google Cloud 控制台中啟用 Cloud Shell。
-
在環境中執行
gcloud kms keyrings create指令:gcloud kms keyrings create KEY_RING \ --location LOCATION更改下列內容:
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
如要執行這段程式碼,請先瞭解如何使用 PHP Google Cloud,並安裝 Cloud KMS PHP SDK。
Python
如要執行這段程式碼,請先設定 Python 開發環境,然後安裝 Cloud KMS Python SDK。
Ruby
如要執行這段程式碼,請先設定 Ruby 開發環境,並安裝 Cloud KMS Ruby SDK。
API
這些範例使用 curl 做為 HTTP 用戶端,示範如何使用 API。如要進一步瞭解存取控管,請參閱「存取 Cloud KMS API」。
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings?key_ring_id=KEY_RING" \
--request "POST" \
--header "authorization: Bearer TOKEN"
更改下列內容:
PROJECT_ID:包含金鑰環的專案 ID。KEY_RING:金鑰所屬金鑰環的名稱。LOCATION:金鑰環的 Cloud KMS 位置。
詳情請參閱 KeyRing.create API 說明文件。
建立金鑰
請按照下列步驟,在指定的金鑰環和位置建立 Cloud HSM 金鑰。
控制台
前往 Google Cloud 控制台的「Key Management」頁面。
找出您要在哪個金鑰環中建立金鑰,然後按一下該金鑰環名稱。
按一下 [Create key] (建立金鑰)。
在「您要建立哪種金鑰?」中,選擇「產生的金鑰」。
在「金鑰名稱」欄位中,輸入金鑰名稱。
按一下「防護等級」下拉式選單,然後選取「HSM」或「單一租戶 HSM」。
如果您選取「單一租戶 HSM」,請選取要建立金鑰的「單一租戶 HSM 執行個體」。
按一下 [Purpose] (目的) 下拉式清單,並選取 [對稱式加密/解密] (Symmetric encrypt/decrypt)。
保留「輪替週期」和「開始日期」的預設值。
點選「建立」。
gcloud
如要在指令列使用 Cloud KMS,請先安裝或升級至最新版 Google Cloud CLI。
如要建立多租戶 Cloud HSM 金鑰,請執行 kms keys create 指令,並使用 hsm 保護層級。
gcloud kms keys create KEY_NAME \
--keyring KEY_RING \
--location LOCATION \
--purpose "encryption" \
--protection-level "hsm"
更改下列內容:
KEY_NAME:您要使用的金鑰名稱。KEY_RING:要建立金鑰的金鑰環名稱。LOCATION:金鑰環的位置。
如要瞭解所有標記和可能的值,請執行含有 --help 標記的指令。
如要建立單一租戶 Cloud HSM 金鑰,請執行 kms keys create 指令,並將防護等級設為 hsm-single-tenant,然後指定要建立金鑰的單一租戶 Cloud HSM 執行個體。單一租戶 Cloud HSM 執行個體必須與金鑰環位於相同位置。
gcloud kms keys create KEY_NAME \
--keyring KEY_RING \
--location LOCATION \
--purpose "encryption" \
--protection-level "hsm-single-tenant" \
--crypto-key-backend="projects/INSTANCE_PROJECT/locations/LOCATION/singleTenantHsmInstances/INSTANCE_NAME"
更改下列內容:
KEY_NAME:您要使用的金鑰名稱。KEY_RING:要在其中建立金鑰的金鑰環名稱。LOCATION:金鑰環的位置。PROTECTION_LEVEL:要建立的金鑰保護等級。INSTANCE_PROJECT:單一租戶 Cloud HSM 執行個體所在的專案 ID。INSTANCE_NAME:要建立金鑰的單一租戶 Cloud HSM 執行個體名稱。如要進一步瞭解單一租戶 Cloud HSM 執行個體,請參閱「建立及管理單一租戶 Cloud HSM 執行個體」。
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
如要執行這段程式碼,請先瞭解如何使用 PHP Google Cloud,並安裝 Cloud KMS PHP SDK。
Python
如要執行這段程式碼,請先設定 Python 開發環境,並安裝 Cloud KMS Python SDK。
Ruby
如要執行這段程式碼,請先設定 Ruby 開發環境,並安裝 Cloud KMS Ruby SDK。
API
這些範例使用 curl 做為 HTTP 用戶端,示範如何使用 API。如要進一步瞭解存取控管,請參閱「存取 Cloud KMS API」。
如要建立多租戶 Cloud HSM 金鑰,請使用 CryptoKey.create 方法,並將保護層級設為 HSM:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys?crypto_key_id=KEY_NAME" \
--request "POST" \
--header "authorization: Bearer TOKEN" \
--header "content-type: application/json" \
--data '{"purpose": "ENCRYPT_DECRYPT", "versionTemplate": {
"protectionLevel": "HSM", "algorithm": "ALGORITHM" }}'
更改下列內容:
PROJECT_ID:包含金鑰環的專案 ID。LOCATION:金鑰環的 Cloud KMS 位置。KEY_RING:金鑰所屬金鑰環的名稱。KEY_NAME:金鑰名稱。ALGORITHM:要使用的演算法,例如GOOGLE_SYMMETRIC_ENCRYPTION。如要查看所有支援的演算法,請參閱「主要用途和演算法」。
如要建立單一租戶 Cloud HSM 金鑰,請使用 CryptoKey.create 方法,並將保護層級設為 HSM_SINGLE_TENANT:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys?crypto_key_id=KEY_NAME" \
--request "POST" \
--header "authorization: Bearer TOKEN" \
--header "content-type: application/json" \
--data '{"purpose": "ENCRYPT_DECRYPT", "versionTemplate": {
"protectionLevel": "HSM_SINGLE_TENANT", "algorithm": "ALGORITHM",
"cryptoKeyBackend": "projects/INSTANCE_PROJECT/locations/LOCATION/singleTenantHsmInstances/INSTANCE_NAME" }}'
更改下列內容:
PROJECT_ID:包含金鑰環的專案 ID。LOCATION:金鑰環的 Cloud KMS 位置。KEY_RING:金鑰所屬金鑰環的名稱。KEY_NAME:金鑰名稱。ALGORITHM:要使用的演算法,例如GOOGLE_SYMMETRIC_ENCRYPTION。如要查看所有支援的演算法,請參閱「主要用途和演算法」。INSTANCE_PROJECT:單一租戶 Cloud HSM 執行個體所在專案的 ID。INSTANCE_NAME:要建立金鑰的單一租戶 Cloud HSM 執行個體名稱。如要進一步瞭解單一租戶 Cloud HSM 執行個體,請參閱「建立及管理單一租戶 Cloud HSM 執行個體」。
加密資料
您現在有了金鑰,就可以使用該金鑰來加密文字或二進位檔內容。
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:要加密的明文資料。呼叫encrypt方法前,明文必須先經過 base64 編碼。
以下是含有 Base64 編碼資料的酬載範例:
{ "plaintext": "U3VwZXIgc2VjcmV0IHRleHQgdGhhdCBtdXN0IGJlIGVuY3J5cHRlZAo=", }
解密密文
如要解密加密內容,您必須使用加密內容時使用的金鑰。
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」。
Cloud KMS 在 JSON 中傳回的解密文字會經過 Base64 編碼。
如要解密加密資料,請發出 POST 要求並提供適當的專案和金鑰資訊,然後在要求主體的 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...", }
後續步驟
本主題的加密範例使用防護等級為 HSM 的對稱金鑰。如要使用防護等級為 HSM 的非對稱金鑰加密,請按照透過非對稱金鑰加密及解密資料的步驟執行,但進行以下變更:
- 在其中一個 Cloud HSM 的支援地區中建立金鑰環。
- 使用保護等級 HSM 來建立金鑰。
如要使用 HSM 保護等級的非對稱金鑰,進行橢圓曲線簽署或 RSA 簽署,請按照「建立及驗證簽章」一文中的步驟操作,並進行下列變更:
- 在其中一個 Cloud HSM 的支援地區中建立金鑰環。
- 使用保護等級 HSM 來建立金鑰。
開始使用 API。
請參閱使用指南,瞭解如何開始建立、輪替及設定金鑰權限。
請參閱「概念」一文,進一步瞭解物件階層、金鑰狀態和金鑰輪替。
瞭解 Cloud KMS 中的記錄。請注意,記錄檔是以作業為準,適用於 HSM 和軟體保護層級的金鑰。
如要進一步瞭解 Cloud HSM 如何保護資料,請參閱 Cloud HSM 架構白皮書。
已知限制
使用者提供的明文和密文 (包括額外驗證資料) 訊息大小上限為 8 KiB (Cloud KMS 軟體金鑰則為 64 KiB)。
並非所有多區域都提供 Cloud HSM。如要查看支援多租戶 Cloud HSM 的所有位置清單,請參閱「Cloud KMS 位置」,然後選取「HSM support」(HSM 支援) 篩選條件的「Supports multi-tenant HSM」(支援多租戶 HSM)。
單一租戶 Cloud HSM 適用於部分提供多租戶 Cloud HSM 的位置。如需支援單一租戶 Cloud HSM 的所有位置清單,請參閱「Cloud KMS 位置」,並選取「HSM 支援」篩選條件的「支援單一租戶 HSM」。
如果您在其他 Google Cloud 服務中,使用 Cloud HSM 金鑰與客戶自行管理的加密金鑰 (CMEK) 整合,則服務使用的位置必須與 Cloud HSM 金鑰的位置完全一致。這適用於區域、雙區域和多區域位置。
如要進一步瞭解 CMEK 整合,請參閱「靜態資料加密」的相關章節。
與使用 Cloud KMS 軟體金鑰相比,儲存在 Cloud HSM 中的非對稱金鑰金鑰作業可能會產生明顯較大的延遲。
Bare Metal Rack HSM
Google Cloud 提供其他 HSM 選項,例如單一租戶。客戶可使用 Bare Metal Rack HSM,在 Google 提供的空間中託管自己的 HSM。如需更多資訊,請洽詢您的帳戶代表。