Topik ini menjelaskan cara menggunakan Kunci Master Pelanggan (CMK) asimetris untuk menghasilkan dan memverifikasi tanda tangan digital. Dalam topik ini, CLI Alibaba Cloud digunakan, namun Anda juga dapat menggunakan SDK KMS.
- Penandatangan mengirimkan kunci publik ke penerima.
- Penandatangan menggunakan kunci privat untuk menandatangani data.
- Penandatangan mengirimkan data dan tanda tangan ke penerima.
- Setelah menerima data dan tanda tangan, penerima menggunakan kunci publik untuk memverifikasi tanda tangan.
Sebelum Anda mulai
Anda harus memanggil operasi CreateKey untuk membuat CMK asimetris di KMS. Saat membuat CMK asimetris, atur parameter KeySpec ke tipe kunci yang ingin digunakan dan setel parameter Usage ke SIGN/VERIFY.
Buat kunci tanda tangan RSA:
aliyun kms CreateKey --KeySpec=RSA_2048 --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSMBuat kunci tanda tangan NIST P-256:
aliyun kms CreateKey --KeySpec=EC_P256 --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSMBuat kunci tanda tangan secp256k1:
aliyun kms CreateKey --KeySpec=EC_P256K --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSM
Pra-pemrosesan sebelum penandatanganan: Hitung digest pesan
Baik operasi penandatanganan RSA maupun ECC melibatkan penghitungan digest dari pesan yang belum ditandatangani terlebih dahulu, kemudian menandatangani digest tersebut.
Dalam contoh-contoh berikut, algoritma digest SHA-256 digunakan.
1. Simpan pesan "this is message" yang perlu ditandatangani ke dalam file message-file.txt:
echo "this is message" > message-file.txt2. Hitung digest SHA-256 dari pesan dan simpan hasil biner ke dalam file message-sha256.bin:
openssl dgst -sha256 -binary -out message-sha256.bin message-file.txtPanggil operasi API KMS untuk menghasilkan tanda tangan
Anda harus memanggil operasi API KMS untuk menghasilkan tanda tangan pesan menggunakan kunci privat.
1. Sebelum mentransmisikan digest pesan melalui jaringan, enkode digest pesan dalam Base64.
openssl base64 -in message-sha256.binBerikut adalah hasil digest yang di-enkode Base64:
uCx5YpLfBrqoYMP8Hf9H7j9/1zT+PPxq1qJRW6uQbos=2. Kirimkan digest yang di-enkode Base64 ke KMS untuk menghasilkan tanda tangan.
- RSASSA-PSS
Untuk kunci RSA, Anda dapat menggunakan algoritma tanda tangan RSASSA-PSS dan algoritma digest SHA-256 untuk menghasilkan tanda tangan. Jalankan perintah berikut:
aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \ --Algorithm=RSA_PSS_SHA_256 --Digest=hRP2cu... { "KeyId": "****", "KeyVersionId": "****", "Value": "J7xmdnZ...", "RequestId": "70f78da9-c1b6-4119-9635-0ce4427cd424" }Dekode nilai tanda tangan dalam Base64 dan hasilkan tanda tangan biner. Tanda tangan ini disimpan dalam file rsa_pss_signature.bin:
echo J7xmdnZ... | openssl base64 -d -out rsa_pss_signature.bin - RSASSA_PKCS1_V1_5
Untuk kunci RSA, Anda dapat menggunakan algoritma tanda tangan RSASSA_PKCS1_V1_5 dan algoritma digest SHA-256 untuk menghasilkan tanda tangan. Jalankan perintah berikut:
aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \ --Algorithm=RSA_PKCS1_SHA_256 --Digest=hRP2cu... { "KeyId": "****", "KeyVersionId": "****", "Value": "qreBkH/u...", "RequestId": "4be57288-f477-4ecd-b7be-ad8688390fbc" }Dekode nilai tanda tangan dalam Base64 dan hasilkan tanda tangan biner. Tanda tangan ini disimpan dalam file rsa_pkcs1_signature.bin:
echo qreBkH/u... | openssl base64 -d -out rsa_pkcs1_signature.bin - NIST P-256
Untuk kurva NIST P-256, Anda dapat menggunakan algoritma tanda tangan ECDSA dan algoritma digest SHA-256 untuk menghasilkan tanda tangan. Jalankan perintah berikut:
aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \ --Algorithm=ECDSA_SHA_256 --Digest=hRP2cu... { "KeyId": "****", "KeyVersionId": "****", "Value": "MEYCIQD33Y98...", "RequestId": "472d789c-d4be-4271-96bb-367f7f0f8ec3" }Dekode nilai tanda tangan dalam Base64 dan hasilkan tanda tangan biner. Tanda tangan ini disimpan dalam file ec_p256_signature.bin:
echo MEYCIQD33Y98... | openssl base64 -d -out ec_p256_signature.bin - secp256k1
Jalankan perintah berikut:
aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \ --Algorithm=ECDSA_SHA_256 --Digest=hRP2cu... { "KeyId": "****", "KeyVersionId": "****", "Value": "MEYCIQDWuuI...", "RequestId": "fe41abed-91e7-4069-9f6b-0048f5bf4de5" }Dekode nilai tanda tangan dalam Base64 dan hasilkan tanda tangan biner. Tanda tangan ini disimpan dalam file ec_p256k_signature.bin:
echo MEYCIQDWuuI... | openssl base64 -d -out ec_p256k_signature.bin
Peroleh kunci publik
Peroleh kunci publik dari CMK asimetris yang digunakan dari KMS. Untuk informasi lebih lanjut, lihat Peroleh Kunci Publik. Contoh-contoh sebelumnya mengasumsikan bahwa informasi berikut benar:
- Kunci publik dari CMK RSA disimpan ke dalam file rsa_publickey.pub.
- Kunci publik dari CMK NIST P-256 disimpan ke dalam file ec_p256_publickey.pub.
- Kunci publik dari CMK secp256k1 disimpan ke dalam file ec_p256k_publickey.pub.
Gunakan kunci publik untuk memverifikasi tanda tangan
Jalankan perintah berikut untuk memverifikasi tanda tangan. Perintah-perintah tersebut bervariasi berdasarkan jenis kunci dan algoritma tanda tangan yang digunakan.
- 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
Jika tanda tangan lolos verifikasi, sistem akan mengembalikan pesan berikut:
Verified OK