全部產品
Search
文件中心

Key Management Service:非對稱數位簽章

更新時間:Jul 06, 2024

本文以ALIYUN CLI使用為例,簡單描述了使用非對稱CMK產生數位簽章以及驗證簽名的情境。您也可以通過KMS的SDK來實現。

非對稱式加密情境,通常包含以下步驟:
  1. 簽名者將驗簽公開金鑰分發給訊息接收者。
  2. 簽名者使用簽名私密金鑰,對資料產生簽名。
  3. 簽名者將資料以及簽名傳遞給訊息接收者。
  4. 訊息接收者獲得資料和簽名後,使用公開金鑰針對資料驗證簽名的合法性。

開始之前

您需要使用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的簽名運算,都是針對需要簽名的訊息首先計算摘要,隨後對摘要進行簽名運算。

說明 擷取摘要的演算法和調用KMS計算簽名的演算法需要一致。例如:簽名演算法ECDSA_SHA_256需要結合SHA-256摘要演算法使用,如果使用SHA-384演算法計算摘要,則和ECDSA_SHA_256演算法不匹配。

樣本中均使用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,產生簽名。

說明 這一步針對不同的密鑰和簽名演算法,調用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