本文以CLI使用為例,簡單描述了使用非對稱CMK進行數據加密和解密的場景。
非對稱加解密場景,通常包含以下步驟:
- 信息接收者將加密公鑰分發給信息傳送者。
- 信息傳送者使用公鑰對敏感信息進行加密保護。
- 信息傳送者將敏感信息的密文傳遞給信息接收者。
- 信息接收者使用私鑰將敏感信息的密文解密。
前提條件
您需要調用CreateKey接口,在KMS中創建非對稱密鑰(設定KeySpec參數),并且設定Usage參數為ENCRYPT/DECRYPT
。
創建密鑰類型為RSA_2048的密鑰:
aliyun kms CreateKey --KeySpec=RSA_2048 --KeyUsage=ENCRYPT/DECRYPT --ProtectionLevel=HSM
獲取公鑰
1. 調用GetPublicKey接口獲取非對稱密鑰的公鑰。
aliyun kms GetPublicKey --KeyId=5c438b18-05be-40ad-b6c2-3be6752c**** --KeyVersionId=2ab1a983-7072-4bbc-a582-584b5bd8****
預期輸出:
{
"RequestId": "82c383eb-c377-4mf6-bxx8-81hkc1g5g7ab",
"KeyId": "5c438b18-05be-40ad-b6c2-3be6752c****",
"KeyVersionId": "2ab1a983-7072-4bbc-a582-584b5bd8****",
"PublicKey": "PublicKey-Data****"
}
2. 將公鑰存入名為
rsa_publickey.pub
的文件中(PublicKey-Data****是占位符,請替換為真實的公鑰)。echo PublicKey-Data**** > rsa_publickey.pub
使用公鑰加密數據
1. 創建一個示例明文文件plaintext-file.txt,包含內容this is plaintext。
echo "this is plaintext" > plaintext-file.txt
2. 使用OpenSSL對文件進行加密,將得到的二進制密文寫入文件plaintext-file.enc。
openssl pkeyutl -encrypt -in plaintext-file.txt \
-inkey rsa_publickey.pub -pubin \
-pkeyopt rsa_padding_mode:oaep \
-pkeyopt rsa_oaep_md:sha256 \
-pkeyopt rsa_mgf1_md:sha256 \
-out plaintext-file.enc
調用KMS解密數據
您需要調用KMS接口使用私鑰解密數據。
1. 在對密文數據進行網絡傳輸之前,首先需要對其進行Base64編碼。
openssl base64 -in plaintext-file.enc
預期輸出 :
5kdCB06HHeAwgfH9ARY4/9Nv5vlpQ94GXZcmaC9FE59Aw8v8RYdozT6ggSbyZbi+
8STKVq9402MEfmUDmwJLuu0qgAZsCe5wU4JWHh1y84Qn6HT068j0qOy5X2HIlrjs
fCdetgtMtVorSgb3bbERk2RV67nHWrDkecNbUaz+6ik4AlZxv2uWrV62eQ9yUBYm
Jb956LbqnfWdCFxUSHH/qB5QCnLpijzvPmfNlZr653H4nF08gpZjnmlF4FjTu3i2
mGLzK4J3Rh/l7PQHiVMdc4hSnXosg68QmMVdZBGLK9/cD9SYngPDiirU7z0q7Git
dIeloyCAUDFyuQC6a+SqzA==
2. 將Base64編碼后的密文傳入KMS,解密數據。
aliyun kms AsymmetricDecrypt \
--KeyId 5c438b18-05be-40ad-b6c2-3be6752c**** \
--KeyVersionId 2ab1a983-7072-4bbc-a582-584b5bd8**** \
--Algorithm RSAES_OAEP_SHA_256 \
--CiphertextBlob 5kdCB06HHeAwgfH9ARY4/9Nv5vlpQ94GXZcmaC9FE59Aw8v8RYdozT6ggSbyZbi+8STKVq9402MEfmUDmwJLuu0qgAZsCe5wU4JWHh1y84Qn6HT068j0qOy5X2HIlrjsfCdetgtMtVorSgb3bbERk2RV67nHWrDkecNbUaz+6ik4AlZxv2uWrV62eQ9yUBYmJb956LbqnfWdCFxUSHH/qB5QCnLpijzvPmfNlZr653H4nF08gpZjnmlF4FjTu3i2mGLzK4J3Rh/l7PQHiVMdc4hSnXosg68QmMVdZBGLK9/cD9SYngPDiirU7z0q7GitdIeloyCAUDFyuQC6a+SqzA==
預期輸出:
{
"KeyId": "5c438b18-05be-40ad-b6c2-3be6752c****",
"KeyVersionId": "2ab1a983-7072-4bbc-a582-584b5bd8****",
"Plaintext": "dGhpcyBpcyBwbGFpbnRleHQgDQo=",
"RequestId": "6be7a8e4-35b9-4549-ad05-c5b1b535a22c"
}
3. 返回結果中的Plaintext經過Base64編碼,對其進行Base64解碼。
echo dGhpcyBpcyBwbGFpbnRleHQgDQo= | openssl base64 -d
解密后的明文數據如下:
this is plaintext