本文說明如何搭配使用金鑰封裝機制 (KEM) 和 Cloud KMS 金鑰,建立共用密鑰。
封裝作業會使用 KEM 金鑰組的公開金鑰,解封裝作業則會使用金鑰組的私密金鑰。Cloud KMS 可讓您擷取公開金鑰,然後搭配標準程式庫封裝共用密鑰。如要解除共用密鑰的封裝,請使用 Cloud KMS 解除封裝方法。您無法在 Cloud KMS 外部使用私密金鑰內容。
事前準備
- 本文提供的範例使用指令列執行。如要簡化範例的使用程序,請使用 Cloud Shell。加密範例使用的是 OpenSSL,已經預先安裝在 Cloud Shell 中。否則,請在電腦上安裝 OpenSSL。
- 建立 key purpose 為
KEY_ENCAPSULATION
的 KEM 金鑰。 如要查看金鑰用途KEY_ENCAPSULATION
支援的演算法,請參閱金鑰封裝演算法。
授予金鑰權限
- 將金鑰的
roles/cloudkms.publicKeyViewer
角色授予每個必須擷取公開金鑰來封裝密鑰的使用者或主體。 - 對必須使用這個金鑰解封密鑰的每位使用者或主體,授予金鑰的 'roles/cloudkms.decapsulator' 角色。
如要進一步瞭解 Cloud KMS 的權限和角色,請參閱「權限和角色」。
封裝
如要使用 KEM 金鑰封裝,請擷取公開金鑰,並使用公開金鑰封裝。
gcloud
這個範例需要在本機系統上安裝 OpenSSL。
下載公開金鑰
gcloud kms keys versions get-public-key KEY_VERSION \ --key KEY_NAME \ --keyring KEY_RING \ --location LOCATION \ --output-file PUBLIC_KEY_FILE \ --public-key-format PUBLIC_KEY_FORMAT
更改下列內容:
KEY_VERSION
:您要用於封裝的金鑰版本號碼,例如2
。KEY_NAME
:您要用於封裝的金鑰名稱。KEY_RING
:金鑰所屬金鑰環的名稱。LOCATION
:金鑰環的 Cloud KMS 位置。PUBLIC_KEY_FILE
:公開金鑰的儲存路徑。PUBLIC_KEY_FORMAT
:公開金鑰的目標格式,例如nist-pqc
。預設格式為pem
。
封裝
如要建立共用密碼和密文,可以使用下列指令:
openssl pkeyutl \ -encap \ -pubin \ -inkey PEM_PUBLIC_KEY_FILE \ -out CIPHERTEXT_FILE \ -secret SHARED_SECRET_FILE
更改下列內容:
PEM_PUBLIC_KEY_FILE
:下載的 PEM 格式公開金鑰檔案路徑。CIPHERTEXT_FILE
:您要儲存產生的密文路徑。SHARED_SECRET_FILE
:您要儲存產生的共用密鑰的路徑。
{ echo -n "MIIEsjALBglghkgBZQMEBAIDggShAA==" | base64 -d ; cat PUBLIC_KEY_FILE; } | \ openssl pkey -inform DER -pubin -pubout -out PEM_PUBLIC_KEY_FILE
更改下列內容:
PUBLIC_KEY_FILE
:下載的原始格式公開金鑰檔案路徑。PEM_PUBLIC_KEY_FILE
:以 PEM 格式儲存公開金鑰的路徑和檔案名稱。
解封裝
使用 Cloud KMS 解除密文封裝。
gcloud
如要在指令列上使用 Cloud KMS,請先安裝或升級至最新版 Google Cloud CLI。
gcloud kms decapsulate \ --version KEY_VERSION \ --key KEY_NAME \ --keyring KEY_RING \ --location LOCATION \ --ciphertext-file CIPHERTEXT_FILE \ --shared-secret-file SHARED_SECRET_FILE
更改下列內容:
KEY_VERSION
:用於解封裝的密鑰版本,例如3
。KEY_NAME
:用於解封裝的金鑰名稱。KEY_RING
:金鑰所屬金鑰環的名稱。LOCATION
:金鑰環的 Cloud KMS 位置。CIPHERTEXT_FILE
:輸入密文的本機檔案路徑。SHARED_SECRET_FILE
:用於儲存輸出共用密鑰的本機檔案路徑。
API
這些範例使用 curl 做為 HTTP 用戶端,示範如何使用 API。如要進一步瞭解存取權控管,請參閱「存取 Cloud KMS API」一文。
請使用 CryptoKeyVersions.decapsulate
方法。
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION:decapsulate" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --data '{"ciphertext": "CIPHERTEXT"}'
更改下列內容:
PROJECT_ID
:含有金鑰環的專案 ID。LOCATION
:金鑰環的 Cloud KMS 位置。KEY_RING
:金鑰所屬金鑰環的名稱。KEY_NAME
:用於加密的金鑰名稱。KEY_VERSION
:用於加密的金鑰版本 IDCIPHERTEXT
:您要解封裝的 Base64 編碼密文。