本文以CLI使用为例,简单描述了使用非对称CMK进行数据加密和解密的场景。您也可以通过KMS的SDK来实现。

非对称加密场景,通常包含以下步骤:
  1. 信息接收者将加密公钥分发给信息传送者。
  2. 信息传送者使用公钥对敏感信息进行加密保护。
  3. 信息传送者将敏感信息的密文传递给信息接收者。
  4. 信息接收者使用私钥将敏感信息的密文解密。

开始之前

您需要调用CreateKey接口,在KMS中创建恰当类型的非对称密钥(设定KeySpec参数),并且设定Usage参数为ENCRYPT/DECRYPT

创建RSA加密密钥:

$ aliyun kms CreateKey --KeySpec=RSA_2048 --KeyUsage=ENCRYPT/DECRYPT --ProtectionLevel=HSM

获取公钥

1. 您需要调用GetPublicKey获取非对称密钥的公钥。

$ aliyun kms GetPublicKey --KeyId=**** --KeyVersionId=****

返回结果如下:

{
        "RequestId": "82c383eb-c377-4mf6-bxx8-81hkc1g5g7ab",
        "KeyId": "****",
        "KeyVersionId": "****",
        "PublicKey": "PublicKey-DataBlob"
}
2. 将公钥存入名为rsa_publickey.pub的文件中(PublicKey-DataBlob是占位符,请替换为真实的公钥):
$ echo PublicKey-DataBlob > 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
得到Base64编码后的密文如下
5kdCB06HHeAwgfH9ARY4/9Nv5vlpQ94GXZcmaC9FE59Aw8v8RYdozT6ggSbyZbi+
8STKVq9402MEfmUDmwJLuu0qgAZsCe5wU4JWHh1y84Qn6HT068j0qOy5X2HIlrjs
fCdetgtMtVorSgb3bbERk2RV67nHWrDkecNbUaz+6ik4AlZxv2uWrV62eQ9yUBYm
Jb956LbqnfWdCFxUSHH/qB5QCnLpijzvPmfNlZr653H4nF08gpZjnmlF4FjTu3i2
mGLzK4J3Rh/l7PQHiVMdc4hSnXosg68QmMVdZBGLK9/cD9SYngPDiirU7z0q7Git
dIeloyCAUDFyuQC6a+SqzA==
2. 随后可以将Base64编码后的密文传入KMS,解密数据:
aliyun kms AsymmetricDecrypt \
  --KeyId **** \
  --KeyVersionId **** \
  --Algorithm RSAES_OAEP_SHA_256 \
  --CiphertextBlob 5kdCB06HHeAwgfH9ARY4/9Nv5vlpQ94GXZcmaC9FE59Aw8v8RYdozT6ggSbyZbi+8STKVq9402MEfmUDmwJLuu0qgAZsCe5wU4JWHh1y84Qn6HT068j0qOy5X2HIlrjsfCdetgtMtVorSgb3bbERk2RV67nHWrDkecNbUaz+6ik4AlZxv2uWrV62eQ9yUBYmJb956LbqnfWdCFxUSHH/qB5QCnLpijzvPmfNlZr653H4nF08gpZjnmlF4FjTu3i2mGLzK4J3Rh/l7PQHiVMdc4hSnXosg68QmMVdZBGLK9/cD9SYngPDiirU7z0q7GitdIeloyCAUDFyuQC6a+SqzA==
返回的结果为:
{
        "KeyId": "****",
        "KeyVersionId": "****",
        "Plaintext": "dGhpcyBpcyBwbGFpbnRleHQgDQo=",
        "RequestId": "6be7a8e4-35b9-4549-ad05-c5b1b535a22c"
}
3. 返回结果中Plaintext是经过Base64编码的,对其进行Base64解码:
echo dGhpcyBpcyBwbGFpbnRleHQgDQo= | openssl base64 -d
得到解密后的明文数据:
this is plaintext