本文以ALIYUN CLI使用為例,簡單描述了使用非對稱CMK生成數字簽名以及驗證簽名的場景。您也可以通過KMS的SDK來實現。
- 簽名者將驗簽公鑰分發給消息接收者。
- 簽名者使用簽名私鑰,對數據產生簽名。
- 簽名者將數據以及簽名傳遞給消息接收者。
- 消息接收者獲得數據和簽名后,使用公鑰針對數據驗證簽名的合法性。
開始之前
您需要使用ALIYUN CLI調用CreateKey接口,在KMS中創建恰當類型的非對稱密鑰(設定KeySpec參數),并且設定Usage參數為SIGN/VERIFY
。
-
創建RSA簽名密鑰:
aliyun kms CreateKey --KeySpec=RSA_2048 --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSM
-
創建NIST P-256簽名密鑰:
aliyun kms CreateKey --KeySpec=EC_P256 --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSM
-
創建secp256k1簽名密鑰:
aliyun kms CreateKey --KeySpec=EC_P256K --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSM
簽名預處理:計算消息摘要
無論是RSA還是ECC的簽名運算,都是針對需要簽名的消息首先計算摘要,隨后對摘要進行簽名運算。
示例中均使用SHA-256摘要算法。
1. 把需要簽名的消息“this is message”存入文件message-file.txt:
echo "this is message" > message-file.txt
2. 計算消息的SHA-256摘要,二進制摘要存入文件message-sha256.bin:
openssl dgst -sha256 -binary -out message-sha256.bin message-file.txt
調用KMS計算簽名
您需要調用KMS接口使用私鑰計算消息的簽名。
1. 在對消息摘要進行網絡傳輸之前,首先需要對其進行Base64編碼:
openssl base64 -in message-sha256.bin
得到Base64編碼后的摘要如下:
uCx5YpLfBrqoYMP8Hf9H7j9/1zT+PPxq1qJRW6uQbos=
2. 隨后可以將Base64編碼后的摘要傳入KMS,產生簽名。
- RSASSA-PSS
RSA密鑰可以使用RSASSA-PSS算法結合SHA-256摘要進行簽名,執行以下ALIYUN CLI命令:
aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \ --Algorithm=RSA_PSS_SHA_256 --Digest=hRP2cu... { "KeyId": "****", "KeyVersionId": "****", "Value": "J7xmdnZ...", "RequestId": "70f78da9-c1b6-4119-9635-0ce4427cd424" }
對簽名結果Value進行Base64解碼并輸出二進制簽名到文件rsa_pss_signature.bin:
echo J7xmdnZ... | openssl base64 -d -out rsa_pss_signature.bin
- RSASSA_PKCS1_V1_5
RSA密鑰可以使用RSASSA_PKCS1_V1_5算法結合SHA-256摘要進行簽名,執行以下ALIYUN CLI命令:
aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \ --Algorithm=RSA_PKCS1_SHA_256 --Digest=hRP2cu... { "KeyId": "****", "KeyVersionId": "****", "Value": "qreBkH/u...", "RequestId": "4be57288-f477-4ecd-b7be-ad8688390fbc" }
對簽名結果Value進行Base64解碼并輸出二進制簽名到文件rsa_pkcs1_signature.bin:
echo qreBkH/u... | openssl base64 -d -out rsa_pkcs1_signature.bin
- NIST P-256
NIST曲線P-256可以使用ECDSA算法結合SHA-256摘要進行簽名,執行以下ALIYUN CLI命令:
aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \ --Algorithm=ECDSA_SHA_256 --Digest=hRP2cu... { "KeyId": "****", "KeyVersionId": "****", "Value": "MEYCIQD33Y98...", "RequestId": "472d789c-d4be-4271-96bb-367f7f0f8ec3" }
對簽名結果Value進行Base64解碼并輸出二進制簽名到文件ec_p256_signature.bin:
echo MEYCIQD33Y98... | openssl base64 -d -out ec_p256_signature.bin
- secp256k1
執行以下ALIYUN CLI命令:
aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \ --Algorithm=ECDSA_SHA_256 --Digest=hRP2cu... { "KeyId": "****", "KeyVersionId": "****", "Value": "MEYCIQDWuuI...", "RequestId": "fe41abed-91e7-4069-9f6b-0048f5bf4de5" }
對簽名結果Value進行Base64解碼并輸出二進制簽名到文件ec_p256k_signature.bin:
echo MEYCIQDWuuI... | openssl base64 -d -out ec_p256k_signature.bin
獲取公鑰
從KMS得到相應的非對稱密鑰的公鑰。具體操作,請參見獲取公鑰。對應于上述示例,我們做如下假定:
- 將RSA密鑰的公鑰存入:rsa_publickey.pub
- 將NIST P-256密鑰的公鑰存入:ec_p256_publickey.pub
- 將secp256k1密鑰的公鑰存入:ec_p256k_publickey.pub
使用公鑰驗證簽名
根據不同的密鑰使用不同類型算法,分別使用如下的命令行進行簽名的驗證:
- RSASSA-PSS
openssl dgst \ -verify rsa_publickey.pub \ -sha256 \ -sigopt rsa_padding_mode:pss \ -sigopt rsa_pss_saltlen:-1 \ -signature rsa_pss_signature.bin \ message-file.txt
- RSASSA_PKCS1_V1_5
openssl dgst \ -verify rsa_publickey.pub \ -sha256 \ -signature rsa_pkcs1_signature.bin \ message-file.txt
- NIST P-256
openssl dgst \ -verify ec_p256_publickey.pub \ -sha256 \ -signature ec_p256_signature.bin \ message-file.txt
- secp256k1
openssl dgst \ -verify ec_p256k_publickey.pub \ -sha256 \ -signature ec_p256k_signature.bin \ message-file.txt
如果驗證成功,您應當看到如下輸出:
Verified OK