本主題提供根據非對稱金鑰建立及驗證數位簽名的相關資訊。
數位簽名使用非對稱金鑰的私密金鑰部分建立。簽名則使用相同非對稱金鑰的公開金鑰部分驗證。
事前準備
建立數位簽名時,您必須使用具有
ASYMMETRIC_SIGN
金鑰用途的金鑰。建立金鑰時,請使用ASYMMETRIC_SIGN
。如要驗證簽名,您必須知道建立金鑰時使用的完整演算法。如要使用下方使用
openssl
指令的指令列指示,您必須將這項資訊傳遞給這些指令。將非對稱金鑰的
cloudkms.cryptoKeyVersions.useToSign
權限授予即將執行簽署的使用者或服務。如要瞭解 Cloud Key Management Service 中的權限,請參閱「權限和角色」一文。如果您要驗證簽名,請將非對稱金鑰的
cloudkms.cryptoKeyVersions.viewPublicKey
權限授予即將下載用於驗證的公開金鑰的使用者或服務。如果您要使用指令列,請安裝 OpenSSL (若尚未安裝)。如果使用 Cloud Shell,則 OpenSSL 已安裝。
資料與摘要
您可以透過 data
欄位或 digest
欄位,傳遞 AsymmetricSign 要求的輸入內容。您無法同時指定這兩個欄位。有些演算法需要資料欄位,例如原始演算法和使用 Cloud External Key Manager 金鑰進行簽署。
原始演算法
以 RSA_SIGN_RAW_
前置字串識別的「原始」演算法是 PKCS #1 簽署的變化版本,會省略將編碼至 DigestInfo。在變體中:
- 系統會針對要簽署的訊息計算摘要。
- PKCS #1 填充字元會直接套用至摘要。
- 使用 RSA 私密金鑰計算填入摘要的簽名。
如要使用這些演算法,請按照下列步驟操作:
- 您必須提供原始資料 (而非摘要),做為
data
欄位的一部分。 - 資料長度限制比 RSA 金鑰大小少 11 個位元組。舉例來說,使用 2048 位元 RSA 金鑰的 PKCS #1 最多可簽署 245 個位元組。
- 將
cloudkms.expertRawPKCS1
角色授予適當的使用者或服務。如要瞭解 Cloud Key Management Service 中的權限,請參閱「權限與角色」。
使用原始演算法時,您也可以簽署無法使用預先定義演算法的摘要類型。舉例來說,您可以使用 RSA_SIGN_RAW_2048
金鑰,為已在外部計算的 SHA-512
PKCS #1 DigestInfo 結構簽署。這個程序會產生與標準 RSA_SIGN_PKCS1_2048_SHA512
演算法相同的結果。
ECDSA 支援其他雜湊演算法
我們的 ECDSA 簽署演算法一般格式如下:
EC_SIGN_ELLIPTIC_CURVE_[DIGEST_ALGORITHM]
DIGEST_ALGORITHM 的值為 SHA256
、SHA384
或 SHA512
。由於雜湊運算是在建立簽名之前執行,因此這些簽署演算法也可以與 SHA 以外的摘要 (例如 Keccak) 搭配使用。如要使用 Keccak 摘要,請提供 Keccak 雜湊值,並使用相同長度的 SHA 摘要演算法。舉例來說,您可以在使用 EC_SIGN_P256_SHA256
演算法的請求中使用 KECCAK256
摘要。
建立簽名
gcloud
如要在指令列上使用 Cloud KMS,請先安裝或升級至最新版 Google Cloud CLI。
gcloud kms asymmetric-sign \ --version key-version \ --key key \ --keyring key-ring \ --location location \ --digest-algorithm digest-algorithm \ --input-file input-file \ --signature-file signature-file
將 key-version 替換為要用於簽署的金鑰版本。將 key 替換為鍵名稱。將 key-ring 替換為金鑰所在的金鑰環名稱。將 location 替換為金鑰環的 Cloud KMS 位置。將 digest-algorithm 替換為要使用的演算法。省略 digest-algorithm 可將 input-file 傳送至 Cloud KMS 進行簽署。將 input-file 和 signature-file 替換為要簽署的檔案和簽名檔案的本機路徑。
如需所有旗標和可能值的相關資訊,請搭配 --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.asymmetricSign
方法執行簽署。此方法的回應包含 base64 編碼的簽名。
驗證橢圓曲線簽名
gcloud
如要在指令列上使用 Cloud KMS,請先安裝或升級至最新版 Google Cloud CLI。
取得公開金鑰
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
將 key-version 替換成金鑰版本。將 key 替換為金鑰名稱。將 key-ring 替換為金鑰所在的金鑰環名稱。將 location 替換為金鑰環的 Cloud KMS 位置。將 output-file 替換為檔案路徑,即可在本機系統上儲存公開金鑰。
如需所有旗標和可能值的相關資訊,請搭配 --help
旗標執行指令。
驗證簽名
用於驗證簽名的 OpenSSL 指令取決於建立的簽名類型。舉例來說,如要使用 OpenSSL 驗證 SHA-256 橢圓曲線簽名,您必須指定 -sha256
。如要驗證 SHA-384 橢圓曲線簽名,您必須指定 -sha384
。
openssl dgst \ -sha256 \ -verify public-key-file \ -signature signature-file \ message-file
將變數替換為您自己的值:
public-key-file:包含公開金鑰的檔案路徑 (例如
"./my-key.pub"
)。signature-file:包含要驗證簽名的檔案路徑 (例如
"./my-data.sig"
)。message-file:包含訊息的檔案路徑 (例如
"./my-data.txt"
)。
如果簽名有效,指令會輸出字串 Verified OK
。
如要瞭解所有標記和可能的值,請搭配 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.getPublicKey 方法擷取公開金鑰,然後使用針對指令列範例顯示的指令驗證簽名。
驗證 RSA 簽名
gcloud
如要在指令列上使用 Cloud KMS,請先安裝或升級至最新版 Google Cloud CLI。
取得公開金鑰
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
將 key-version 替換成金鑰版本。將 key 替換為金鑰名稱。將 key-ring 替換為金鑰所在的金鑰環名稱。將 location 替換為金鑰環的 Cloud KMS 位置。將 output-file 替換為本機系統中公開金鑰的儲存路徑。
如需所有旗標和可能值的相關資訊,請搭配 --help
旗標執行指令。
驗證簽名
用於驗證簽名的 OpenSSL 指令取決於建立的簽名類型。例如,如要驗證具有 PSS 填充演算法的 SHA-256 RSA 簽名,您必須指定 -sha256
和 -sigopt rsa_padding_mode:pss
。如要驗證具有 PSS 填充演算法的 SHA-512 RSA 簽名,您必須指定 -sha512
和 -sigopt
rsa_padding_mode:pss
。
openssl dgst \ -sha256 \ -sigopt rsa_padding_mode:pss \ -sigopt rsa_pss_saltlen:-1 \ -verify public-key-file \ -signature signature-file \ message-file
將變數替換為您自己的值:
public-key-file:包含公開金鑰的檔案路徑 (例如
"./my-key.pub"
)。signature-file:包含要驗證簽名的檔案路徑 (例如
"./my-data.sig"
)。message-file:包含訊息的檔案路徑 (例如
"./my-data.txt"
)。
如果簽名有效,指令會輸出字串 Verified OK
。
如要瞭解所有標記和可能的值,請搭配 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.getPublicKey
方法擷取公開金鑰,然後使用針對指令列範例顯示的指令驗證簽名。