全部產品
Search
文件中心

Key Management Service:非對稱資料加解密

更新時間:Jul 06, 2024

本文以CLI使用為例,簡單描述了使用非對稱CMK進行資料加密和解密的情境。

非對稱加解密情境,通常包含以下步驟:
  1. 資訊接收者將加密公開金鑰分發給資訊傳送者。
  2. 資訊傳送者使用公開金鑰對敏感資訊進行加密保護。
  3. 資訊傳送者將敏感資訊的密文傳遞給資訊接收者。
  4. 資訊接收者使用私密金鑰將敏感資訊的密文解密。

前提條件

您需要調用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